Introduction C++ function template uses rvalue reference for different function expression arguments in the higher-order function. Because it is compiled time polymorphism, the code could be optimized very well and the performance should be very good.
In this blog post, I would like to show how to use the C++ function template.
Examples function_template.cpp 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 #include <iostream> template <typename T, typename TF>T runBinaryFunction (T x, T y, TF&& f) { return f (x, y); } template <typename T>T add (T x, T y) { return x + y; } template <class T >class Add { public : T operator () (T x, T y) const { return x + y; } }; template <class T >class Calculator { public : static T add (T x, T y) { return x + y; } }; template <class T >class Calculator2 { public : T add (T x, T y) { return x + y; } }; int main () { int x = 1 ; int y = 2 ; std::cout << &add<int > << std::endl; std::cout << runBinaryFunction (x, y, std::move (add<int >)) << std::endl; std::cout << runBinaryFunction (x, y, Add <int >()) << std::endl; std::cout << runBinaryFunction (x, y, [](int x,int y)->int {return x + y;}) << std::endl; std::cout << &Calculator<int >::add << std::endl; std::cout << runBinaryFunction (x, y, std::move (Calculator<int >::add)) << std::endl; }
To compile the program, please run the following command in the terminal.
1 $ g++ function_template.cpp -o function_template -std=c++11
Using TF f
would actually also work, but it would not serve as a reference. It copies the rvalues to f
, which is unnecessary.
Conclusions The application of the function template might not be as generic as std::function
, but its performance should be better.