Deduce non-type template parameter return value

C

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
 
8

88888 Dihedral

在 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.
 

Ask a Question

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

You'll need to choose a username for the site, which only take a couple of moments. After that, you can post your question and our members will help you out.

Ask a Question

Members online

Forum statistics

Threads
473,744
Messages
2,569,484
Members
44,903
Latest member
orderPeak8CBDGummies

Latest Threads

Top