我想使用模板非类型参数在编译时自动分支代码。即类似的东西:
template<std::size_t TDimension>
class A
{
public:
A()
{}
~A()
{}
void print()
{
if(TDimension == 3)
std::cout << "My dimension is 3" << std::endl;
else if(TDimension == 2)
std::cout << "My dimension is 2" << std::endl;
}
};
上面的代码在运行时分支代码。问题是:如何在编译时启用它以提高性能?
答案 0 :(得分:3)
由于TDimension
和你比较的值都是常量,编译器应只生成if
的一个分支,没有运行时间比较,只要在启用优化时。
可以肯定的是,您可以明确专门化:
template<std::size_t TDimension>
class A
{
public:
void print() {}
// or void print(); to give an error for an handled value
};
template <> void A<3>::print() {std::cout << "My dimension is 3" << std::endl;}
template <> void A<2>::print() {std::cout << "My dimension is 2" << std::endl;}
答案 1 :(得分:1)
对于现在遇到这个问题的任何人,我们都有C ++ 17的称赞:您可以避免使用if constexpr
来使用模板专业化,如果这会让您更满意的话:
void print()
{
if constexpr(TDimension == 3)
std::cout << "My dimension is 3" << std::endl;
else if constexpr(TDimension == 2)
std::cout << "My dimension is 2" << std::endl;
}