#include <iostream>
/* C++03 style */
template <typename R, typename T1, typename T2>
R add(T1 t1, T2 t2)
{
std::cout << "C++03 style" << std::endl;
return(t1 + t2);
}
/* C++11 style */
/* way 1 */
template <typename T1, typename T2>
auto add(T1 t1, T2 t2) ->decltype(t1 + t2)
{
std::cout << "C++11 style, way 1" << std::endl;
return(t1 + t2);
}
/* way 2 */
/*
template <typename T1, typename T2>
decltype(*(T1*)0 * *(T2*)0) add(T1 t1, T2 t2)
{
std::cout << "C++11 style, way 2" << std::endl;
return(t1 + t2);
}
*/
/* way 3*/
/*
template <typename T1, typename T2>
decltype(std::declval<T1>() * std::declval<T2>()) add(T1 t1, T2 t2)
{
std::cout << "C++11 style, way 3" << std::endl;
return(t1 + t2);
}
*/
/* way 4 */
/*
template <typename T>
struct DeclVal
{
T operator () ();
};
template <typename T1, typename T2>
decltype(DeclVal<T1>()() * DeclVal<T2>()()) add(T1 t1, T2 t2)
{
std::cout << "C++11 style, way 4" << std::endl;
return(t1 + t2);
}
*/
/* way 5 */
/*
template <typename T>
T decl_val();
template <typename T1, typename T2>
decltype(decl_val<T1>() * decl_val<T2>()) add(T1 t1, T2 t2)
{
std::cout << "C++11 style, way 5" << std::endl;
return(t1 + t2);
}
*/
int main(int argc, char * argv[])
{
auto d = 0.0;
auto i = sizeof(d);
std::cout << "sizeof(0.0) = " << i << std::endl;
auto v1 = 5;
auto v2 = 3.8;
auto v3 = add(v1, v2);
decltype(v1 + v2) v4 = add(v1, v2);
auto v5 = add<double>(v1, v2);
std::cout << "v1 = " << v1 << std::endl;
std::cout << "v2 = " << v2 << std::endl;
std::cout << "v3 = " << v3 << std::endl;
std::cout << "v4 = " << v4 << std::endl;
std::cout << "v5 = " << v5 << std::endl;
return(0);
}