这样写代码有意义吗?
template<bool X>
double foo(double x){
return (X) ? moo(x) : bar(x);
}
我知道有更好的方法来实现这个示例,但我想知道,假设编译器将识别死代码并将其实例化为通常是否安全
double foo<true>(double x){return moo(x);}
double foo<false>(double x){return bar(x);}
最佳答案
这里要记住的是,模板与 C# 等语言中的泛型等语言功能不同。
将模板视为一种类型感知的高级预处理器是一种相当安全的简化。这就是 Template metaprogramming (TMP) 背后的想法这基本上是编译时编程。
就像扩展预处理器模板一样,结果会经历与正常逻辑相同的所有优化阶段。
这是一个以与 TMP 更一致的风格重写逻辑的示例。这使用了函数特化。
template<bool X>
double foo(double x);
template<>
double foo<true>(double x)
{
return moo(x);
}
template<>
double foo<false>(double x)
{
return bar(x);
}
TMP被发现实际上是一次愉快的意外,并且几乎是 STL 的面包和黄油。和 Boost 。
是turing complete所以你可以在编译时进行各种计算。
它是惰性评估的,因此您可以通过将无效逻辑放入您不想使用的模板的专门化中来实现您自己的编译时断言。例如,如果我要注释掉 foo<false>
特化并尝试像foo<false>(1.0);
一样使用它编译器会提示,尽管它会对 foo<true>(1.0);
非常满意。 .
Here另一篇 Stack Overflow 帖子演示了这一点。
如果有兴趣,请进一步阅读:
关于c++ - 编译器如何优化模板?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33444263/