#include <iostream>
#include <vector>
template < class T>
struct average
{
typedef T InternalType; // default
InternalType operator( ) ( const std:: vector < T> & v)
{
InternalType vectorSum = 0 ;
for ( unsigned int i = 0 ; i < v.size ( ) ; ++ i)
{
vectorSum + = v[ i] ;
}
return vectorSum / static_cast < float > ( v.size ( ) ) ;
}
} ;
template <>
struct average< unsigned char >
{
typedef float InternalType;
} ;
int main( int argc, char * argv[ ] )
{
std:: vector < float > floatVector;
std:: vector < unsigned char > ucVector;
for ( unsigned int i = 0 ; i < 5 ; ++ i)
{
floatVector.push_back ( i) ;
ucVector.push_back ( i) ;
}
average< float > floatAverageFunctor;
average< unsigned char > ucAverageFunctor;
std:: cout << "Float average: " << floatAverageFunctor( floatVector) << std:: endl ;
std:: cout << "UC average: " << ucAverageFunctor( ucVector) << std:: endl ;
return 0 ;
}
I2luY2x1ZGUgPGlvc3RyZWFtPgojaW5jbHVkZSA8dmVjdG9yPgoKdGVtcGxhdGUgPGNsYXNzIFQ+CnN0cnVjdCBhdmVyYWdlCnsKICB0eXBlZGVmIFQgSW50ZXJuYWxUeXBlOyAvLyBkZWZhdWx0CgogIEludGVybmFsVHlwZSBvcGVyYXRvcigpKGNvbnN0IHN0ZDo6dmVjdG9yPFQ+JiB2KQogIHsKICAgIEludGVybmFsVHlwZSB2ZWN0b3JTdW0gPSAwOwogICAgZm9yKHVuc2lnbmVkIGludCBpID0gMDsgaSA8IHYuc2l6ZSgpOyArK2kpCiAgICB7CiAgICAgIHZlY3RvclN1bSArPSB2W2ldOwogICAgfQogICAgcmV0dXJuIHZlY3RvclN1bSAvIHN0YXRpY19jYXN0PGZsb2F0Pih2LnNpemUoKSk7CiAgfQp9OwoKdGVtcGxhdGUgPD4Kc3RydWN0IGF2ZXJhZ2U8dW5zaWduZWQgY2hhcj4KewogIHR5cGVkZWYgZmxvYXQgSW50ZXJuYWxUeXBlOwp9OwoKaW50IG1haW4oaW50IGFyZ2MsIGNoYXIgKmFyZ3ZbXSkKewogIHN0ZDo6dmVjdG9yPGZsb2F0PiBmbG9hdFZlY3RvcjsKICBzdGQ6OnZlY3Rvcjx1bnNpZ25lZCBjaGFyPiB1Y1ZlY3RvcjsKCiAgZm9yKHVuc2lnbmVkIGludCBpID0gMDsgaSA8IDU7ICsraSkKICB7CiAgICBmbG9hdFZlY3Rvci5wdXNoX2JhY2soaSk7CiAgICB1Y1ZlY3Rvci5wdXNoX2JhY2soaSk7CiAgfQoKICBhdmVyYWdlPGZsb2F0PiBmbG9hdEF2ZXJhZ2VGdW5jdG9yOwogIGF2ZXJhZ2U8dW5zaWduZWQgY2hhcj4gdWNBdmVyYWdlRnVuY3RvcjsKICBzdGQ6OmNvdXQgPDwgIkZsb2F0IGF2ZXJhZ2U6ICIgPDwgZmxvYXRBdmVyYWdlRnVuY3RvcihmbG9hdFZlY3RvcikgPDwgc3RkOjplbmRsOwogIHN0ZDo6Y291dCA8PCAiVUMgYXZlcmFnZTogIiA8PCB1Y0F2ZXJhZ2VGdW5jdG9yKHVjVmVjdG9yKSA8PCBzdGQ6OmVuZGw7CgogIHJldHVybiAwOwp9Cg==
compilation info
prog.cpp: In function ‘int main(int, char**)’:
prog.cpp:40: error: no match for call to ‘(average<unsigned char>) (std::vector<unsigned char, std::allocator<unsigned char> >&)’
stdout