如何扩展模板参数

时间:2016-12-01 17:21:27

标签: c++ templates

我对这个模板的扩展感到困惑[例一]。如果在运行时在构造函数中检查bool b哪里存储了b?它被放入私人数据部分[例二]?或者它是否成为编译时间并删除基于bool的分支?或者只是简单地粘贴"什么作为模板参数传递到if(b)[例3]

示例一:

template<bool b>
    class Test
    {
    public:
        Test()
        {
            if(b)
            {
                // do something
            }
            else
            {
                // do something else
            }
        }
    };

示例二:

class Test
{
public:
    Test()
    {
        if(b)
        {
            // do something
        }
        else
        {
            // do something else
        }
    }

private:
    bool b = true;
};

示例三:

//called with Test<true>

class Test
{
public:
    Test()
    {
        if(true)
        {
            // do something
        }
        else
        {
            // do something else - probably removed due too compiler optimization
        }
    }
};

1 个答案:

答案 0 :(得分:2)

示例3 是更接近编译器正在执行的代码段。了解示例2是错误的非常重要,因为模板参数在编译时进行评估,而不是作为字段注入到类中。

执行if(b){ } else { } b是模板bool参数,if语句的两个分支都需要可解析格式良好,即使编译器很可能优化不匹配b的分支。

如果您希望保证编译时分支评估,并且如果您只需要采用分支格式良好,则可以在C ++ 17中使用if constexpr(...)

if constexpr(b)
{
    // do something
}
else
{
    // do something else
}

...或在C ++ 14中实现自己的static_if构造...

...或在C ++ 11中使用explicit template specialization

我在CppCon 2016演讲"Implementing static control flow in C++14"中介绍了所有这些技巧。