Параметры по умолчанию для методов класса шаблона - PullRequest
0 голосов
/ 25 сентября 2011

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

template<class T>
class A
{
public:
    A foo(T t);
};

Как мне изменить это, чтобы дать foo параметр по умолчанию типа T?Например: T равно int, то значение по умолчанию равно -23, или T равно char*, затем значение по умолчанию "something" и т. Д. Возможно ли это вообще?

1 Ответ

3 голосов
/ 25 сентября 2011

Если вы хотите, чтобы параметром по умолчанию было только значение по умолчанию (обычно ноль), тогда вы можете написать 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";
};
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...