Google Groups no longer supports new Usenet posts or subscriptions. Historical content remains viewable.
Dismiss

Deduce non-type template parameter return value

27 views
Skip to first unread message

Chris McAce

unread,
Feb 7, 2012, 7:59:41 PM2/7/12
to
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

88888 Dihedral

unread,
Feb 8, 2012, 3:18:37 AM2/8/12
to
在 2012年2月8日星期三UTC+8上午8时59分41秒,Chris McAce写道:
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.

0 new messages