这样写代码有意义吗?
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#之类的泛型之类的语言功能。
将模板视为类型识别的高级预处理器是相当安全的简化方法。这是模板元编程(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的基础。
它已经完成,因此您可以在编译时进行各种计算。
它是惰性计算的,因此您可以通过在不想使用的模板的特殊化中放置无效逻辑来实现自己的编译时声明。例如,如果我要注释掉foo<false>
专业化并试图像foo<false>(1.0);
编译器会抱怨的那样使用它,尽管它会非常满意foo<true>(1.0);
。
这是另一个Stack Overflow帖子,演示了这一点。
如有兴趣,请进一步阅读:
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句