fork download
  1. #include <utility>
  2.  
  3. template <typename...>
  4. struct sum_impl;
  5.  
  6. /* This is the base case */
  7. template <typename T1, typename T2>
  8. struct sum_impl<T1, T2>
  9. {
  10. typedef decltype(std::declval<const T1&>() + std::declval<const T2&>()) result_type;
  11.  
  12. static result_type doit(const T1& v1, const T2& v2)
  13. {
  14. return v1 + v2;
  15. }
  16. };
  17.  
  18. /* And here is the recursive definition for left-associativity */
  19. template <typename T1, typename T2, typename... Ts>
  20. struct sum_impl<T1, T2, Ts...>
  21. {
  22. typedef decltype(std::declval<const T1&>() + std::declval<const T2&>()) step_type;
  23. typedef typename sum_impl<step_type, Ts...>::result_type result_type;
  24.  
  25. static result_type doit(const T1& v1, const T2& v2, const Ts&... rest)
  26. {
  27. return sum_impl<step_type, Ts...>::doit(v1 + v2, rest...);
  28. }
  29. };
  30.  
  31. template <typename... Ts>
  32. typename sum_impl<Ts...>::result_type sum(const Ts&... args)
  33. {
  34. return sum_impl<Ts...>::doit(args...);
  35. }
  36.  
  37. #include <iostream>
  38. int main(void)
  39. {
  40. std::cout << sum(1, 3, 5, 7, 9, 11) << std::endl;
  41. std::cout << sum(1, 3.4, 5, 7, 9, 11) << std::endl;
  42. }
  43.  
Success #stdin #stdout 0s 2852KB
stdin
Standard input is empty
stdout
36
36.4