Параметры по умолчанию для методов класса шаблона
Есть ли способ предоставить значения параметров по умолчанию для методов класса шаблона? Например, у меня есть следующее:
template<class T>
class A
{
public:
A foo(T t);
};
Как я должен изменить это, чтобы дать foo
параметр по умолчанию типа T
? Например: T
является int
тогда значение по умолчанию -23, или T
является char*
тогда значение по умолчанию "something"
и т.д. Возможно ли это вообще?
1 ответ
Если вы хотите, чтобы параметр по умолчанию был просто значением по умолчанию (обычно ноль), тогда вы можете написать 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";
};