微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

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

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

在此页面的示例中:https://en.cppreference.com/w/cpp/utility/variant一个带有单个模板参数的 std::variant

std::variant<std::string> x("abc");

既然一个变体允许存储一个可以属于一组不同类的对象,那么前一行的目的是什么?不应该是一样的:

std::string x("abc");

解决方法

它的目的是证明 std::variant 可以使用变体类型的转换构造函数之一,只要它是明确的。

使用这个例子可能会更好一些

std::variant<std::string,int> x("abc");

相反,为了更清楚地展示这一点。

,

取决于您所说的“相同”是什么意思。这两行代码在内存中肯定没有相同的布局,也没有相同的访问模式。

至于它存在的原因,嗯——对称。如果您要支持大量模板参数,那么没有什么可以阻止您同时支持一个。事实上,如果它采用递归路线(如 C# 的值元组),它可以使实现更容易。因此,只需将其投入使用,让人们可以根据需要使用它。

,

该特定行的重点是展示“转换构造函数在明确时工作”。

允许带有单个模板参数的 std::variant 的要点是会产生实施成本并且收益不足以证明成本的合理性。

允许带有单个模板参数的 std::variant 的一个好处来自模板的强大功能。也许库提供了一个模板,其参数之一必须是 std::variant。从概念上讲,这将是一个枚举模板某些方面必须处理的各种类型的参数。 (这是否是一个好的方法是一个单独的问题。对于图书馆的用户来说,这也是一个学术问题。)假设您有这个类的用途,但您只需要它处理单一类型。没问题。您使用 std::variant<the_type> 作为模板参数。一个特殊情况是免费处理的(如果模板没有错误),即使库的作者没有预料到这个用例。与 std::variant 必须至少有两个模板参数相比,模板更通用,涵盖更多情况。

这是否过于理论化/在实践中不太可能发生?我没有 variant 的示例,但我有 tuple 的示例。与此问题类似,您可以询问带有单个模板参数的 tuple 的用途。 Q: C++ tbb flow graph,multifunction_node giving incomplete type error 的上下文涉及一个库模板,该模板期望其参数之一是 tuple 类型。该问题的作者只有一种类型。提供那种类型的 tuple 允许使用模板。与 tuple 必须至少采用两个模板参数相比,该库模板更加通用。

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。