С шаблонной структурой переноса чисел:
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
.Можно ли это сделать?