我们来一个模板类:
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)>
?
我想必须有办法,因为所有信息都可以在编译时获得。
答案 0 :(得分:3)
虽然所有信息都可以在编译时获得,但您尝试使它看起来像是在运行时将对象传递给函数。除了你已经列出的替代方法之外,根本没办法做到这一点。
makeA<int>()
对我来说似乎是完全合理的(如果非常有人工作,但我会认为你的真实T
更复杂),并且与标准库已经提供的“制造者”功能一致。