Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

C++ template function default value

Is it possible to define the default value for variables of a template function in C++?

Something like below:

template<class T> T sum(T a, T b, T c=????)
{
     return a + b + c;
}
like image 744
MBZ Avatar asked Jul 21 '10 16:07

MBZ


4 Answers

Try this:

template<class T> T sum(T a, T b, T c=T())
{
     return a + b + c;
}

You can also put in T(5) if you are expecting an integral type and want the default value to be 5.

like image 54
Scharron Avatar answered Nov 18 '22 00:11

Scharron


It all depends on the assumptions that you can do about the type.

template <typename T> T sum( T a, T b, T c = T() ) { return a+b+c; }
template <typename T> T sum2( T a, T b, T c = T(5) ) { return a+b+c; }

The first case, it only assumes that T is default constructible. For POD types that is value inititalization (IIRC) and is basically 0, so sum( 5, 7 ) will call sum( 5, 7, 0 ).

In the second case you require that the type can be constructed from an integer. For integral types, sum( 5, 7 ) will call sum( 5, 7, int(5) ) which is equivalent to sum( 5, 7, 5 ).

like image 30
David Rodríguez - dribeas Avatar answered Nov 17 '22 23:11

David Rodríguez - dribeas


Yes you can define a default value.

template <class T> 
T constructThird()
{
    return T(1);
}

template <class T> 
T test(T a, 
       T b, 
       T c = constructThird<T>())
{
    return a + b + c;
}

Unfortunately constructThird cannot take a and b as arguments.

like image 2
computinglife Avatar answered Nov 17 '22 22:11

computinglife


Yes, there just needs to be a constructor for T from whatever value you put there. Given the code you show, I assume you'd probably want that argument to be 0. If you want more than one argument to the constructor, you could put T(arg1, arg2, arg3) as the default value.

like image 1
Phil Miller Avatar answered Nov 17 '22 22:11

Phil Miller