Параметры по умолчанию для методов класса шаблона

Есть ли способ предоставить значения параметров по умолчанию для методов класса шаблона? Например, у меня есть следующее:

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";
};
Другие вопросы по тегам