使用模板化数字包装结构:
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
的模板声明范围内不可用。可以吗?
答案 0 :(得分:2)
完全可能 - 只需传入*((T*)nullptr)
即可获得任何类型T的左值,无论其可构造性如何。毕竟,您实际使用构造函数参数执行的操作是将其传递给id
,然后传递给decltype
,这在模板中是完全可行的,因为您知道x
的类型是T
。
template<typename T, int I = identity<decltype(id(*((T*)nullptr)))>::type::n> struct Zod {
...
};