有没有办法根据运行时值的类型返回constexpr对象?

时间:2017-05-15 22:12:47

标签: c++ templates constexpr

我们来一个模板类:

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

错误是:&#39; i&#39;不能用于常量表达式。

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

那么我如何实例化一个模仿i的类型的constexpr A,而不必拼出A<int>A<decltype(i)>

我想必须有办法,因为所有信息都可以在编译时获得。

1 个答案:

答案 0 :(得分:3)

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

makeA<int>()对我来说似乎是完全合理的(如果非常有人工作,但我会认为你的真实T更复杂),并且与标准库已经提供的“制造者”功能一致。