Если вы хотите, чтобы параметром по умолчанию было только значение по умолчанию (обычно ноль), тогда вы можете написать A foo(T t = T())
.В противном случае, я предлагаю класс черты:
template <typename T> struct MyDefaults
{
static const T value = T();
};
template <> struct MyDefaults<int>
{
static const int value = -23;
};
template<class T>
class A
{
public:
A foo(T t = MyDefaults<T>::value);
};
Запись значения константы внутри определения класса, я полагаю, работает только для целочисленных типов, поэтому вам, возможно, придется записать его снаружи для всех других типов:
template <> struct MyDefaults<double>
{
static const double value;
};
const double MyDefaults<double>::value = -1.5;
template <> struct MyDefaults<const char *>
{
static const char * const value;
};
const char * const MyDefaults<const char *>::value = "Hello World";
В C ++ 11 вы могли бы альтернативно сказать static constexpr T value = T();
, чтобы заставить шаблон работать для нецелых значений, при условии, что T
имеет конструктор по умолчанию, который объявлен constexpr
:
template <typename T> struct MyDefaults
{
static constexpr T value = T();
};
template <> struct MyDefaults<const char *>
{
static constexpr const char * value = "Hello World";
};