0

我想使用模板非类型参数在编译时自动分支代码。即类似的东西:

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;
    }
};

上面的代码在运行时分支代码。问题是:如何在编译时启用它以提高性能?

4

2 回答 2

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;}
于 2013-07-22T15:00:11.537 回答
1

对于现在遇到这个问题的任何人,因为我们有幸使用 C++17:您可以通过 using 避免使用模板专业化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;
}
于 2019-10-19T20:45:33.377 回答