gpt4 book ai didi

c++ - 开关语句和整数模板值

转载 作者:太空狗 更新时间:2023-10-29 21:24:17 25 4
gpt4 key购买 nike

我知道如果我实例化一个模板,例如:

template<int i>
int ReturnMeDouble()
{
return 2 * i;
}

然后编译器需要能够在编译时评估 i 的值。我的问题是(为简单起见简化)我希望我的程序根据变量调用两个函数之一。我的代码看起来像这样:

int returnValue = 0;
switch(value)
{
case 1:
case 2:
case 3:
case 4:
returnValue = ReturnMeDouble<value>();
break;
case 5:
case 6:
returnValue = ReturnMeTriple<value>();
break;
}

真正的 ReturnMe... 函数做一些不那么琐碎的事情。现在很明显,我可以使用这个 switch 语句并在每个 case 语句下提供单独的调用,但我只是想知道我是否遗漏了什么,因为在我看来(如果不是编译器的话)在第一种情况下很明显, ReturnMeDouble 只能用四个值之一调用。

仅仅是因为编译器必须围绕需要实例化的四个独立函数模板设置一个条件流程(实际上是我试图避免手动执行的操作)并且它不知道该怎么做吗?

有没有更优雅的方式来做到这一点?

编辑:为了澄清 - 不太简单的实现使用整数值来应用一些元程序以在函数内进行类型选择。

最佳答案

认为您的尝试解释已经基本准确。

标准的看待事物的方式很简单,您作为模板参数提供的值必须是编译时已知的常量。由于您提供的值是一个直到运行时才知道的变量,因此根本不允许。

是的,在这种特定情况下,具有适当优化器的编译器可能会计算出需要为您给出的四种情况提供的四个常量值。

不过,还有很多案例可能不那么明确。例如,包含某些特定优化的编译器可以确定特定值实际上是编译时常量,但另一个缺乏特定优化的编译器将不知道。

面对他们无法回答的问题(“编译器能否在编译时推导出这个值?”)委员会采取了相当保守的方法,并指定了相对狭窄的允许输入范围。当然,编译器可以选择接受其他表达式作为扩展。

从委员会的角度来看,我认为添加 constexpr 是对至少相当相似的事物的相当普遍的实现的尝试——允许以一种允许更大范围的计算的方式进行编译器知道结果应该作为编译时常量可用。考虑到实现这一点的复杂性,我的猜测是不太可能(至少在不久的将来)对您上面给出的情况强制进行编译时计算。

关于c++ - 开关语句和整数模板值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16567278/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com