Original Discussion: -> [Cviet]
Code Relax #2 [ by rox_rook ]
Given a template to get sum below
template< typename T >
inline
T calculate_sum_of_element( const T* i, const T* e )
{
T sum = T( ); // a zero value for any type
while( i != e )
{
sum += *i;
++i;
}
return sum;
}
Try this on int and char array
#include <iostream>
using namespace std;
template< typename T >
inline
T calculate_sum_of_element( const T* i, const T* e )
{
T sum = T( ); // a zero value for any type
while( i != e )
{
sum += *i;
++i;
}
return sum;
}
int main( )
{
int int_ary[ 3 ] = { 1, 2, 3 };
cout << calculate_sum_of_element( int_ary, int_ary + 3 ) << endl;
char char_ary[ 3 ] = { 'a', 'b', 'c' };
cout << calculate_sum_of_element( char_ary, char_ary + 3 ) << endl;
return 0;
}
The result for int is 6 as expected; however, for char it supposed to be 97 + 98 + 99 = 294, but the character '&' is printed out.
Requirement
+ Re-write the given template function to make char data type return an int value
+ Language in use: C++
Solution [ by author, rox_rook ]
#include <iostream>
#include <fstream>
#include <iostream>
#include <string>
using namespace std;
template< typename T >
class Trait;
template< >
class Trait< char >
{
public :
typedef int SumType;
static SumType zero( )
{
return 0;
}
};
template< >
class Trait< short >
{
public :
typedef short SumType;
static SumType zero( )
{
return 0;
}
};
template< >
class Trait< unsigned >
{
public :
typedef unsigned SumType;
static SumType zero( )
{
return 0;
}
};
template< >
class Trait< double >
{
public :
typedef double SumType;
static SumType zero( )
{
return 0;
}
};
template< >
class Trait< int >
{
public :
typedef int SumType;
static SumType zero( )
{
return 0;
}
};
template< typename T >
inline
typename Trait< T >::SumType calculate_sum_of_element( const T* i, const T* e )
{
typedef typename Trait< T >::SumType SumType; // create shortcut, less typo
SumType sum = Trait< T >::zero( );
while( i != e )
{
sum += *i;
++i;
}
return sum;
}
int main( )
{
char char_ary[ 3 ] = { 'a', 'b', 'c' };
cout << calculate_sum_of_element( char_ary, char_ary + 3 ) << endl;
double d_ary[ 3 ] = { 1.1, 2.2 , 3.3 };
cout << calculate_sum_of_element( d_ary , d_ary + 3 ) << endl;
int i_ary[ 3 ] = { 1, 2 , 3 };
cout << calculate_sum_of_element( i_ary , i_ary + 3 ) << endl;
}
Evaluation
- It's freaking unthinking of....lol