![](/img/trans.png)
[英]What is the purpose of std::thread constructor third template parameter?
[英]What is the purpose of a `std::variant` with a single template parameter?
在此页面上的示例中: https://en.cppreference.com/w/cpp/utility/variant有一个带有单个模板参数的std::variant
:
std::variant<std::string> x("abc");
由于一个变体允许存储一个可以属于一组不同类的 object,那么上一行的目的是什么? 不应该与以下内容相同:
std::string x("abc");
它的目的是证明std::variant
可以使用变体类型的转换构造函数之一,只要它是明确的。
使用这个例子可能会更好一些
std::variant<std::string, int> x("abc");
相反,为了更清楚地展示这一点。
取决于您所说的“相同”是什么意思。 这两行代码在 memory 中肯定没有相同的布局,也没有相同的访问模式。
至于它存在的原因,嗯——对称。 如果您要支持大量模板 arguments,没有什么能阻止您也支持一个。 事实上,如果它走递归路线(如 C# 的值元组),它可以使实现更容易。 所以只要把它扔进去,让人们根据需要使用它。
该特定行的重点是演示“转换构造函数在明确时起作用”。
允许带有单个模板参数的std::variant
的意义在于,会产生实现成本,而收益不足以证明成本合理。
允许带有单个模板参数的std::variant
的一个好处来自模板的强大功能。 也许库提供了一个模板,其中一个参数必须是std::variant
。 从概念上讲,这将是一个枚举模板某些方面必须处理的各种类型的参数。 (这是否是一个好方法是一个单独的问题。对于图书馆的用户来说,这也是一个学术问题。)假设你有这个 class 的用途,但你只需要它来处理一个类型。 没问题。 您使用std::variant<the_type>
作为模板参数。 一个特殊情况是免费处理的(如果模板没有错误),即使库的作者没有预料到这个用例。 与std::variant
必须具有至少两个模板 arguments 相比,该模板更通用,涵盖更多情况。
这是否过于理论化/在实践中不太可能发生? 我没有一个variant
的例子,但我有一个tuple
的例子。 与此问题类似,可以询问具有单个模板参数的tuple
的用途。 Q 的上下文:C++ tbb 流图,multifunction_node 给出不完整类型错误涉及一个库模板,该模板期望其参数之一是类型tuple
。 该问题的作者只有一种类型。 提供一种类型的tuple
允许使用模板。 如果tuple
必须采用至少两个模板 arguments,那么该库模板将更加通用。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.