12得票1回答
当使用libc++时,为什么sizeof(std::variant< char >)等于8而不是2(就像MSVC的STL和libstdc++一样)?

考虑这个编译器探索中的例子。 基本上,我们有这个代码片段:#include &lt;cstdint&gt; #include &lt;variant&gt; enum class Enum1 : std::uint8_t { A, B }; enum class Enum2 : std:...

11得票1回答
在变体中,作为替代类型之一,我应该使用什么来代替void?

我想要一个变量,它可以包含类型 Foo、类型 Bar,或者什么都不包含。自然而然地,我在考虑使用 std::variant&lt;Foo, Bar, void&gt; - 但是似乎无法使用。也就是说,你可以定义这个类型,但如果你尝试实例化它,你会失败(GCC 8.2)。 那么我应该使用什么?...

10得票4回答
如何在使用C++ std::visit时改善编译器错误信息?

我正在使用C++17的std::visit()函数处理一个有许多选项的variant,但是每当我在visitor中忘记一个或多个选项时,编译器产生的错误消息非常难以理解。 例如:template&lt;class... Ts&gt; struct overloaded : Ts... { u...

10得票1回答
为什么std::variant的实现对于空类型的变量需要占用超过1个字节的空间?

这基本上是一道琐事题,因为我怀疑我永远不会需要节省这个空间。 在 godbolt 上玩耍时,我注意到 libstdc++ 和 libc++ 的实现都需要使用超过 1 字节来存储空结构体的 variant。 libstc++ 使用 2 字节 libc++ 使用 8 字节 我认为这只是没有必要优化...

10得票4回答
std::bind用于绑定包含多个std::function类型的std::variant

我正在尝试使用回调函数,并希望通过std::bind注册多个具有不同签名(尽管它们都返回void)的函数。将std::bind的结果分配给std::variant会导致“转换为非标量类型”的错误。这是一个歧义错误吗?我能否向编译器提供更多信息? 删除std::bind(允许赋值)不是一种选择...

10得票1回答
boost::variant是否有类似于std::visit的boost::visit?

在C++14中,我使用boost::variant作为编译时多态的一种方式: using MyType = boost::variant&lt;A, B&gt;; 两个类都有一个方法sayHello()。我想调用: MyType obj = ...; // either A() or ...

9得票2回答
如何在构造std::variant时禁用指针类型到bool的隐式转换?

请考虑以下内容: struct foo { }; struct bar { }; int main() { foo f; bar b; std::variant&lt;foo*, bool&gt; v; v = &amp;b; // compiles in...

8得票1回答
使用C++20将std::variant与int进行比较<=>不是常量表达式

由于标准库中不允许使用std::variant与其替代类型进行比较,因此我正在使用 C++20 中的 &lt;=&gt; 操作符实现比较函数: template &lt;typename... Args, typename T&gt; constexpr auto operator&lt;=...

8得票1回答
在C++中,我能否将std::variant中的某个元素移出?

我有一个资源包装类,它是不可复制的,但可以移动。大致代码如下: class Wrapper { SomeResource* m_handle = nullptr; public: Wrapper(const Wrapper&amp;) = delete; Wrapper&amp;...

7得票1回答
我可以使lambda表达式推断出变量返回类型吗?

这主要是理论性的,因为我可以始终详细说明返回类型,但我想知道是否有一种方法可以告诉lambda,返回类型应该是lambda体中所有返回的联合(std::variant)。 #include &lt;iostream&gt; #include &lt;variant&gt; struct A...