template非类型参数:在编译时检查条件

时间:2013-07-22 14:53:43

标签: c++ templates template-meta-programming

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

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

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

2 个答案:

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