【问题标题】:Class template argument dependent on constructor类模板参数依赖于构造函数
【发布时间】:2011-04-07 22:10:55
【问题描述】:

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

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>(); }

我可以使用decltypeid 的返回参数类型来初始化Zod 结构的m_i 成员:

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的模板声明范围内不可用。可以吗?

【问题讨论】:

  • 我想制作m_i static const 不是一种选择?出于好奇,您想实现什么目标?

标签: c++ templates constructor


【解决方案1】:

这完全有可能——只需传入*((T*)nullptr) 即可获得任何类型 T 的左值,无论其可构造性如何。毕竟,你实际上对构造函数参数所做的只是将它传递给id,然后传递给decltype,这在模板中是完全可行的,因为你知道x 的类型是T

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

【讨论】:

  • 啊啊!我一直在尝试构建一个需要以我概述的方式使用值的问题。可能不存在。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2015-01-24
  • 2013-03-30
  • 2021-07-26
  • 1970-01-01
  • 2018-05-18
  • 2010-12-17
  • 2012-03-19
相关资源
最近更新 更多