Many good features were added to C++11 to simplify the metaprogramming. One such feature is the alternative function syntax. It allows deducing the result type of a template function. Here is an example:
template <class T1, class T2> auto my_function_cpp11(const T1& v1, const T2& v2) -> decltype(v1 + v2) { return v1 + v2; }
It allows us to write generic functions more easily:
#include <cassert> struct s1 {}; struct s2 {}; struct s3 {}; inline s3 operator + (const s1& /*v1*/, const s2& /*v2*/) { return s3(); } inline s3 operator + (const s2& /*v1*/, const s1& /*v2*/) { return s3(); } int main() { s1 v1; s2 v2; s3 res0 = my_function_cpp11(v1, v2); assert(my_function_cpp11('\0', 1) == 1); }
But, Boost has a lot of functions like these and it does not require C++11 to work. How is that possible and how can we make a C++03 version of the my_function_cpp11
function?