Deduce non-type template parameter return value

Discussion in 'C++' started by Chris McAce, Feb 8, 2012.

  1. Chris McAce

    Chris McAce Guest

    Hi,

    I've written a function template for applying a free function to every
    element of a std::vector:

    #include <vector>

    template<class T, T F(T)>
    std::vector<T> map(const std::vector<T>& from)
    {
    std::vector<T> to;
    to.reserve(from.size());
    for (typename std::vector<T>::const_iterator iter = from.begin();
    iter != from.end(); ++iter) {
    to.push_back(F(*iter));
    }
    return to;
    }

    This can be used as follows:

    #include <cmath>

    int main()
    {
    std::vector<float> angles;
    angles.push_back(1);
    angles.push_back(2);
    angles.push_back(3);
    std::vector<float> sines = map<float, std::sin>(angles);
    }

    As you can see, std::sin is passed as a non-type template parameter.
    However, I'd like to get rid of the the first parameter (float in the
    example) so the call would become map<std::sin>(angles). Is there a
    way to do this in C++03 or C++11?

    Please note that I don't want to pass function pointers at run-time;
    the mapping function (here, std::sin) is known at compile-time so I
    want to take advantage of that.

    Thanks,
    Chris
    Chris McAce, Feb 8, 2012
    #1
    1. Advertising

  2. 在 2012å¹´2月8日星期三UTC+8上åˆ8æ—¶59分41秒,Chris McAce写é“:
    > Hi,
    >
    > I've written a function template for applying a free function to every
    > element of a std::vector:
    >
    > #include <vector>
    >
    > template<class T, T F(T)>
    > std::vector<T> map(const std::vector<T>& from)
    > {
    > std::vector<T> to;
    > to.reserve(from.size());
    > for (typename std::vector<T>::const_iterator iter = from.begin();
    > iter != from.end(); ++iter) {
    > to.push_back(F(*iter));
    > }
    > return to;
    > }
    >
    > This can be used as follows:
    >
    > #include <cmath>
    >
    > int main()
    > {
    > std::vector<float> angles;
    > angles.push_back(1);
    > angles.push_back(2);
    > angles.push_back(3);
    > std::vector<float> sines = map<float, std::sin>(angles);
    > }
    >
    > As you can see, std::sin is passed as a non-type template parameter.
    > However, I'd like to get rid of the the first parameter (float in the
    > example) so the call would become map<std::sin>(angles). Is there a
    > way to do this in C++03 or C++11?
    >
    > Please note that I don't want to pass function pointers at run-time;
    > the mapping function (here, std::sin) is known at compile-time so I
    > want to take advantage of that.
    >
    > Thanks,
    > Chris


    A template function that accepts any data type and any known function to
    operate on a vector of objects to be compiled is different from
    an unknown function pointer passed in by the caller part in the run time.

    Any object in a vector can be mapped as in the above code.
    The constructor has to be called for each new object pushed into the result
    vector to.

    Note if the object is very large and the length of the vector is large, too
    then the above code might run into problems in the heap space.
    88888 Dihedral, Feb 8, 2012
    #2
    1. Advertising

Want to reply to this thread or ask your own question?

It takes just 2 minutes to sign up (and it's free!). Just click the sign up button to choose a username and then you can ask your own questions on the forum.
Similar Threads
  1. Dan Krantz
    Replies:
    3
    Views:
    425
    Howard Hinnant
    Jun 13, 2006
  2. Replies:
    7
    Views:
    535
  3. George2

    template function argument deduce

    George2, Mar 11, 2008, in forum: C Programming
    Replies:
    0
    Views:
    369
    George2
    Mar 11, 2008
  4. Maik
    Replies:
    2
    Views:
    991
  5. nguillot
    Replies:
    5
    Views:
    530
Loading...

Share This Page