类模板参数依赖于构造函数

时间:2011-04-07 22:10:55

标签: c++ templates constructor

使用模板化数字包装结构:

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 个答案:

答案 0 :(得分:2)

完全可能 - 只需传入*((T*)nullptr)即可获得任何类型T的左值,无论其可构造性如何。毕竟,您实际使用构造函数参数执行的操作是将其传递给id,然后传递给decltype,这在模板中是完全可行的,因为您知道x的类型是T

template<typename T, int I = identity<decltype(id(*((T*)nullptr)))>::type::n> struct Zod {
    ...
};