Как специализировать шаблон класса для целочисленного типа с самим целочисленным типом? - PullRequest
0 голосов
/ 08 мая 2018

У меня есть шаблон класса X, который выглядит следующим образом:

template <typename T>
class X {
 public:
   X(T &t): t_ {t} {}

 private:
   T &t_;
};

Есть ли способ специализировать его для T = int, чтобы выражение X<int>(i) для целого числа i ничего не делало, но "возвращало" только i время компиляции?

Другими словами, я хотел бы иметь тот же синтаксис для double и int (X<double>(d) и X<int>(i) соответственно), но первый вызывает конструктор, который инициализирует ссылку, как показано в коде выше, в то время как последний игнорирует этот «синтаксический сахар» и «возвращает» целое число i, ничего не делая.

1 Ответ

0 голосов
/ 08 мая 2018

Вы можете указать специализацию шаблона для int и double соответственно и использовать оператор преобразования. Примерно так:

// the same applies for double
template<>
class X<int> {
 public:
   constexpr X(int t) : t_ {t} {}

   constexpr operator int() const { return t; }

 private:
   int t_;
};

Это позволит что-то вроде следующего работать (поправьте меня, если я неправильно понял ваш вопрос):

constexpr int n = X<int>(20); // n == 20
...