Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/templates/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 模板非类型参数:编译时检查条件_C++_Templates_Template Meta Programming - Fatal编程技术网

C++ 模板非类型参数:编译时检查条件

C++ 模板非类型参数:编译时检查条件,c++,templates,template-meta-programming,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; e

我想使用模板非类型参数在编译时对代码进行自动分支。例如:

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;
    }
};
模板
甲级
{
公众:
()
{}
~A()
{}
作废打印()
{
如果(t尺寸==3)

std::cout由于
t维度
和与之比较的值都是常量,只要启用优化,编译器应该只生成
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;}
模板
甲级
{
公众:
无效打印(){}
//或void print();为已处理的值提供错误
};

模板void A::print(){std::cout由于
t维度
和与之比较的值都是常量,只要启用优化,编译器应该只生成
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;}
模板
甲级
{
公众:
无效打印(){}
//或void print();为已处理的值提供错误
};

template void A::print(){std::cout对于任何遇到这个问题的人来说,现在我们有了C++17:如果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;
}
void print()
{
如果constexpr(t尺寸==3)

std::cout对于任何在我们拥有C++17之后遇到这个问题的人来说:如果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;
}
void print()
{
如果constexpr(t尺寸==3)

std::你能测量一下这段代码的性能吗?没有?那么你怎么知道当你改变它的时候你是否提高了性能?如果没有什么可以改进的,你就无法改进。(别担心,编译器已经为你做了优化。)常量表达式和死分支消除是非常容易实现的优化成果。有理由想要一个真正的编译时分支,但它们通常涉及“如果参数错误,另一个分支甚至不会编译”。您测量过此代码的性能吗?没有?那么您如何知道在更改代码时是否提高了性能?如果没有需要改进的地方,您将无法改进。(别担心,编译器已经为您进行了优化。)常量表达式和死分支消除是非常容易实现的优化成果。有理由想要一个真正的编译时分支,但它们通常涉及“如果参数错误,另一个分支甚至不会编译”.你的代码根本不在乎愚蠢的程序员告诉它什么-它总是在三维;)完美。这就是我要找的。你的代码根本不在乎愚蠢的程序员告诉它什么-它总是在三维;)完美。这就是我要找的。