我对这个模板的扩展感到困惑[例一]。如果在运行时在构造函数中检查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
}
}
};
答案 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"中介绍了所有这些技巧。