考虑这个编译器探索中的例子。 基本上,我们有这个代码片段:#include <cstdint> #include <variant> enum class Enum1 : std::uint8_t { A, B }; enum class Enum2 : std:...
我想要一个变量,它可以包含类型 Foo、类型 Bar,或者什么都不包含。自然而然地,我在考虑使用 std::variant<Foo, Bar, void> - 但是似乎无法使用。也就是说,你可以定义这个类型,但如果你尝试实例化它,你会失败(GCC 8.2)。 那么我应该使用什么?...
我正在使用C++17的std::visit()函数处理一个有许多选项的variant,但是每当我在visitor中忘记一个或多个选项时,编译器产生的错误消息非常难以理解。 例如:template<class... Ts> struct overloaded : Ts... { u...
这基本上是一道琐事题,因为我怀疑我永远不会需要节省这个空间。 在 godbolt 上玩耍时,我注意到 libstdc++ 和 libc++ 的实现都需要使用超过 1 字节来存储空结构体的 variant。 libstc++ 使用 2 字节 libc++ 使用 8 字节 我认为这只是没有必要优化...
我正在尝试使用回调函数,并希望通过std::bind注册多个具有不同签名(尽管它们都返回void)的函数。将std::bind的结果分配给std::variant会导致“转换为非标量类型”的错误。这是一个歧义错误吗?我能否向编译器提供更多信息? 删除std::bind(允许赋值)不是一种选择...
在C++14中,我使用boost::variant作为编译时多态的一种方式: using MyType = boost::variant<A, B>; 两个类都有一个方法sayHello()。我想调用: MyType obj = ...; // either A() or ...
请考虑以下内容: struct foo { }; struct bar { }; int main() { foo f; bar b; std::variant<foo*, bool> v; v = &b; // compiles in...
由于标准库中不允许使用std::variant与其替代类型进行比较,因此我正在使用 C++20 中的 <=> 操作符实现比较函数: template <typename... Args, typename T> constexpr auto operator<=...
我有一个资源包装类,它是不可复制的,但可以移动。大致代码如下: class Wrapper { SomeResource* m_handle = nullptr; public: Wrapper(const Wrapper&) = delete; Wrapper&...
这主要是理论性的,因为我可以始终详细说明返回类型,但我想知道是否有一种方法可以告诉lambda,返回类型应该是lambda体中所有返回的联合(std::variant)。 #include <iostream> #include <variant> struct A...