Аргумент шаблона класса зависит от конструктора - PullRequest
0 голосов
/ 08 апреля 2011

С шаблонной структурой переноса чисел:

template <int I> struct Num { static const int n = I; };

и несколькими перегруженными функциями:

template <typename T>
Num<0> id(T x)      { return Num<0>(); }
Num<1> id(int x)    { return Num<1>(); }
Num<2> id(double x) { return Num<2>(); }
Num<3> id(char x)   { return Num<3>(); }

Я могу инициализировать член m_i структуры Zod, используя decltype и тип возвращаемого аргумента id:

template <typename T>
struct Zod {
  Zod(T x) { m_i = identity<decltype(id(x))>::type::n; }
  int m_i;
};

Однако, мне бы очень хотелось, чтобы структура Zod имела второй целочисленный аргумент шаблона, инициализированный значением, котороеm_i было установлено на.

template <typename T, int I = ?>
struct Zod { ... }

Это кажется возможным, поскольку выражение identity / decltype оценивается как постоянная времени компиляции;например, это нормально в глобальной области видимости:

char c;
static const int g = identity<decltype(id(c))>::type::n;

Проблема в том, что аргумент x конструктора недоступен в области действия шаблона Zod.Можно ли это сделать?

1 Ответ

2 голосов
/ 08 апреля 2011

Вполне возможно - просто введите *((T*)nullptr), чтобы получить l-значение любого типа T независимо от его конструктивности.В конце концов, все, что вы на самом деле делаете с аргументом конструктора, это передаете его id, а затем decltype, что вполне выполнимо в шаблоне, поскольку вы знаете, что тип x равен T. * 1006.*

template<typename T, int I = identity<decltype(id(*((T*)nullptr)))>::type::n> struct Zod {
    ...
};
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...