【发布时间】:2017-03-11 18:21:56
【问题描述】:
我正在寻找一种在处理模板布尔函数时避免使用 if 语句的方法。
下面的代码显示了我的情况的简化。
#include <iostream>
#include <string>
template<bool var>
void f(){
std::cout << (var ? "TRUE" : "FALSE") << std::endl;
}
int main(int argc, char* argv[]){
const bool b = (std::string(argv[1]).compare("TRUE") == 0);
if (b) f<true>();
else f<false>();
return 0;
}
我不想将b 作为函数f() 的参数传递,因为在实际应用中,我对性能感兴趣,我需要在关键代码中检查b 的值部分。
我想要一种写法:f<b>();
但是这样做,我得到以下错误:error: the value of ‘b’ is not usable in a constant expression
由于在我的应用程序中我有 4 个 bool 模板,我想避免列出这四个模板的所有组合,例如:
if(b1 && b2 && b3 && b4) f<true,true,true,true>();
else if (b1 && b2 && b3 && !b4) f<true,true,true,false>();
...
有办法解决吗?是否存在我可以以某种方式使用的快捷方式?
我也尝试使用 if 语句快捷方式 f<(b?true:false)>();,
但我收到了与上面相同的错误。
【问题讨论】:
-
如果它们真的是可变参数,请使用正确的工具而不是模板参数。
-
argv 在运行时已知, b 必须在编译时已知,所以你被卡住了。使 b const 不会有任何好处。
-
是的,但不存在一种优雅的方式来写下来?
-
f(b)有什么问题? -
这是在优化错误。首先,您尝试使用编译时计算来优化测试运行时值。那是行不通的。您需要在此代码中测试该变量 somewhere。其次,避免这种假设的性能损失不值得使您的代码不可读。第三,别再担心了!优化器和分支预测器将一起完成一项出色的工作,以确保运行时初始化的常量不会在每次测试时都受到惩罚。不信,自己编译一些测试用例,自己看看吧!
标签: c++ templates if-statement boolean