带有单个模板参数的 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
必须至少采用两个模板参数时更加通用。
在此页面的示例中: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
必须至少采用两个模板参数时更加通用。