gpt4 book ai didi

c++ - 模板参数是如何展开的

转载 作者:行者123 更新时间:2023-11-28 01:56:45 25 4
gpt4 key购买 nike

我对这个模板的扩展感到困惑 [示例一]。如果在运行时在构造函数中检查 bool b b 存储在哪里?它是否放入私有(private)数据部分[示例二]?或者它是否成为编译时间并删除基于 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
}
}
};

最佳答案

示例 3 是与编译器正在执行的操作更相似的代码段。重要的是要了解示例 2 是错误的,因为模板参数是在编译时计算的,而不是作为字段注入(inject)到类中。

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


如果你想要有保证的编译时分支评估,并且如果你只需要采取的分支是格式良好,你可以使用if constexpr(...)在 C++17 中:

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

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

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

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

关于c++ - 模板参数是如何展开的,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40916695/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com