fork download
  1. #include <iostream>
  2. #include <cstdlib>
  3. #include <valarray>
  4. #include <numeric>
  5. using namespace std;
  6.  
  7. template<typename ...Args> constexpr inline void non(Args ...) {}
  8.  
  9. template<typename T, typename ...Args>
  10. inline T sum1(T val, Args ...args) { non(val += args ...); return val; } // v1
  11. // why do we need some function non() here?
  12.  
  13. template<typename T, typename ...Args>
  14. inline T sum2(T val, Args ...args) { auto tmp = { val += args... }; return val; } // v2
  15. // why do we need some array tmp[] here?
  16.  
  17. template<typename T, typename ...Args>
  18. inline T sum3(T val, Args ...args) { [](...){}((val += args)... ); return val; } // v3
  19. // why do we need empty lambda [](...){} here?
  20.  
  21. template<typename T, typename ...Args>
  22. inline T sum4(T val, Args ...args) { for (auto &i : { args... }) val += i; return val; } // v4
  23.  
  24. template<typename ...Args, typename T = common_type_t<Args...>>
  25. inline T sum5(Args ...args) { return std::valarray<T>({ args... }).sum(); } // v5
  26.  
  27.  
  28. template<typename T> constexpr inline T sum6(T val) { return val; }
  29.  
  30. template<typename T, typename ...Args>
  31. constexpr inline T sum6(T val, Args ...args) { return val + sum6(args...); } // v6
  32.  
  33.  
  34. int main() {
  35.  
  36. cout << sum1(1, 2, 3) << endl;
  37. cout << sum2(1, 2, 3) << endl;
  38. cout << sum3(1, 2, 3) << endl;
  39. cout << sum4(1, 2, 3) << endl;
  40. cout << sum5(1, 2, 3) << endl;
  41. cout << sum6(1, 2, 3) << endl;
  42.  
  43. return 0;
  44. }
Success #stdin #stdout 0s 3460KB
stdin
Standard input is empty
stdout
6
6
6
6
6
6