繁体   English   中英

带有单个模板参数的 `std::variant` 的目的是什么?

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM