带有单个模板参数的 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");

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

std::string x("abc");

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

如果使用

,示例可能会更好一些
std::variant<std::string, int> x("abc");

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

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

至于它存在的原因,嗯——对称性。如果您要支持大量模板参数,没有什么能阻止您也支持一个。事实上,如果它采用递归路线(如 C# 的值元组),它可以使实现更容易。所以把它扔进去,让人们想用就用。

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

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

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

这是否过于理论化/不太可能在实践中发生?我没有 variant 的示例,但我有一个 tuple 的示例。与此问题类似,人们可能会询问 tuple 具有单个模板参数的目的。 的上下文涉及一个库模板,该模板期望其参数之一是 tuple 类型。该问题的作者只有一种类型。提供该类型的 tuple 允许使用模板。该库模板比 tuple 必须至少采用两个模板参数时更加通用。