【问题标题】:Is there a way to return a constexpr object based on the type of runtime values?有没有办法根据运行时值的类型返回一个 constexpr 对象?
【发布时间】:2017-05-16 06:21:37
【问题描述】:

我们来看一个模板类:

template<typename T>
class A{};

还有一个辅助函数,通过类型推导实例化 A:

template<typename T>
constexpr A<T> makeA(T)
{
    return A<T>();
}

最后是运行时值,但其类型 (int) 在编译时是已知的:

int i = //... retrieving a runtime value;

以下内容无法编译,虽然它只使用了 i 的类型,而不是它的值:

constexpr auto a = makeA(i);

错误是:'i' 的值不能用于常量表达式。

我知道i 不能被传递,因为它的值在编译时是未知的,但另一方面makeA 完全丢弃了这个值。

那么我怎样才能实例化一个以 i 类型为模板的 constexpr A,而不必拼出 A&lt;int&gt;A&lt;decltype(i)&gt;

我想一定有办法,因为所有信息在编译时都可用。

【问题讨论】:

  • @πάνταῥεῖ:问题说明了这一点。
  • 为什么不 makeA()?
  • 你还有decltype(makeA(i))
  • 常量表达式只能包含(计算的)常量子表达式。这是一个简单的规则,很容易在编译器中实现。原则上可以定义(更)更复杂的规则,但故意不这样做(并且decltype 作为内置语言原语被专门引入以从非常量表达式中提取类型)。所以答案是否定的。

标签: c++ templates constexpr


【解决方案1】:

虽然所有信息都在编译时可用,但您正试图真正让它看起来像是在运行时将对象传递给函数。除了您已经列出的替代方法之外,根本没有其他方法可以做到这一点。

makeA&lt;int&gt;() 对我来说似乎完全合理(如果非常做作,但我会假设你真正的 T 更复杂),并且与标准库已经提供的“制造商”函数一致。

【讨论】:

    猜你喜欢
    • 2020-12-06
    • 2013-08-31
    • 1970-01-01
    • 2012-04-27
    • 2013-07-02
    • 1970-01-01
    • 1970-01-01
    • 2023-02-09
    • 2015-10-22
    相关资源
    最近更新 更多