为什么允许std::variant多次持有相同的类型?

可以是什么用例 std::variant多次持有相同类型什么?

请参阅https://en.cppreference.com/w/cpp/utility/variant

只有在开始调用时才能找到问题std::get<T>(v)

回答

假设我们想要表示一个可以是关键字、标识符或符号的标记。因此,一种可能的实现是:

enum TokenType : std::size_t {
    Keyword = 0, Identifier = 1, Symbol = 2
};

using Token = std::variant<std::string, std::string, char>;

现在可以使用,例如:

std::get<TokenType::Keyword>(token)

访问替代方案。

这是否是一个好主意当然有争议,但它确实表明存在这样的用例。


回答

std 变体被设计为在通用代码中用作总和类型。

它需要两个变体 a 和 b(只有一个是活动的)的变体合并的代数性质,如果 a 是活动的,则替代索引等于 a,如果 b 是活动的,则 a 中的替代计数加上 b 的替代索引.

因为,老实说,那里的其他任何事情都是疯狂的。

从根本上说,变体成员的名称是索引,而不是类型。

您可以自由地编写一个变体别名来禁止您自己的代码的重复类型。这相对容易。

如果那个(类型替代命名变体)是基础,编写基于索引的变体会很烦人。

通过反射,使用命名的替代品制作变体也将是合理的。同样,如果我们阻止具有重复类型的基于索引的变体,这将更加困难。


以上是为什么允许std::variant多次持有相同的类型?的全部内容。
THE END
分享
二维码
< <上一篇
下一篇>>