#include <iostream>
#include <vector>
#include <type_traits>
template <
typename Iter,
typename T = typename std:: enable_if <
std:: is_arithmetic < typename std:: iterator_traits < Iter> :: value_type > :: value ,
typename std:: iterator_traits < Iter> :: value_type
> :: type
>
T summer( Iter start, Iter end)
{
T sum{ } ;
for ( auto it = start; it ! = end; it++ )
{
sum + = * it;
}
return sum;
}
int main( )
{
std:: vector < double > vec { 0.1 , 0.2 , 0.3 } ; // these are OK
auto sum = summer( vec.begin ( ) , vec.end ( ) ) ;
std:: cout << sum << std:: endl ;
int arr[ ] = { 1 , 2 , 3 } ; // these are OK
auto sum2 = summer( arr, arr+ 3 ) ;
std:: cout << sum2 << std:: endl ;
std:: vector < std:: string > vec3 { "a" , "b" } ; // these are rejected
auto sum3 = summer( vec3.begin ( ) , vec3.end ( ) ) ;
std:: cout << sum3 << std:: endl ;
return 0 ;
}
I2luY2x1ZGUgPGlvc3RyZWFtPgojaW5jbHVkZSA8dmVjdG9yPgojaW5jbHVkZSA8dHlwZV90cmFpdHM+Cgp0ZW1wbGF0ZTwKICB0eXBlbmFtZSBJdGVyLAogIHR5cGVuYW1lIFQgPSB0eXBlbmFtZSBzdGQ6OmVuYWJsZV9pZjwKICAgIHN0ZDo6aXNfYXJpdGhtZXRpYzx0eXBlbmFtZSBzdGQ6Oml0ZXJhdG9yX3RyYWl0czxJdGVyPjo6dmFsdWVfdHlwZT46OnZhbHVlLAogICAgdHlwZW5hbWUgc3RkOjppdGVyYXRvcl90cmFpdHM8SXRlcj46OnZhbHVlX3R5cGUKICA+Ojp0eXBlCj4KVCBzdW1tZXIoSXRlciBzdGFydCwgSXRlciBlbmQpCnsKICAgIFQgc3Vte307CiAgICBmb3IgKGF1dG8gaXQgPSBzdGFydDsgaXQgIT0gZW5kOyBpdCsrKQogICAgewogICAgICAgIHN1bSArPSAqaXQ7CiAgICB9CiAgICByZXR1cm4gc3VtOwp9CgppbnQgbWFpbigpCnsKICAgIHN0ZDo6dmVjdG9yPGRvdWJsZT4gdmVjIHswLjEsIDAuMiwgMC4zfTsgIC8vIHRoZXNlIGFyZSBPSwogICAgYXV0byBzdW0gPSBzdW1tZXIodmVjLmJlZ2luKCksIHZlYy5lbmQoKSk7CiAgICBzdGQ6OmNvdXQgPDwgc3VtIDw8IHN0ZDo6ZW5kbDsKCiAgICBpbnQgYXJyW10gPSB7MSwgMiwgM307ICAvLyB0aGVzZSBhcmUgT0sKICAgIGF1dG8gc3VtMiA9IHN1bW1lcihhcnIsIGFyciszKTsKICAgIHN0ZDo6Y291dCA8PCBzdW0yIDw8IHN0ZDo6ZW5kbDsKCiAgICBzdGQ6OnZlY3RvcjxzdGQ6OnN0cmluZz4gdmVjMyB7ImEiLCAiYiJ9OyAgLy8gdGhlc2UgYXJlIHJlamVjdGVkCiAgICBhdXRvIHN1bTMgPSBzdW1tZXIodmVjMy5iZWdpbigpLCB2ZWMzLmVuZCgpKTsKICAgIHN0ZDo6Y291dCA8PCBzdW0zIDw8IHN0ZDo6ZW5kbDsKCiAgICByZXR1cm4gMDsKfQ==
compilation info
prog.cpp: In function ‘int main()’:
prog.cpp:33:48: error: no matching function for call to ‘summer(std::vector<std::__cxx11::basic_string<char> >::iterator, std::vector<std::__cxx11::basic_string<char> >::iterator)’
auto sum3 = summer(vec3.begin(), vec3.end());
^
prog.cpp:12:3: note: candidate: ‘template<class Iter, class T> T summer(Iter, Iter)’
T summer(Iter start, Iter end)
^~~~~~
prog.cpp:12:3: note: template argument deduction/substitution failed:
prog.cpp:7:3: error: no type named ‘type’ in ‘struct std::enable_if<false, std::__cxx11::basic_string<char> >’
typename T = typename std::enable_if<
^~~~~~~~
stdout