定义 boost 变体类型以传递明确的空值

Define boost variant type to pass explicitly empty values

我想要 boost::variant 为空状态。所以我定义了一个 boost::variantboost::blank 作为第一个选择。但是后来我想将其作为函数参数传递:

void f(Variant v);
...
void g()
{
   f(boost::blank{});
}

因为牙套,看起来不太好看。如果接受 boost::none:

似乎更好
void g()
{
   f(boost::none);
}

但我不认为我在任何地方见过 boost::variant<boost::none_t, ...>boost::none_tboost::optional 的卫星。可以与 boost::variant 一起使用吗?

您可以只使用默认构造,这将初始化第一个元素类型。

或者您可以定义自己的 boost::blank:

类型常量

Live On Wandbox

#include <boost/variant.hpp>
#include <iostream>

using Variant = boost::variant<
    boost::blank,
    int,
    std::string>;

void foo(Variant v = {}) {
    std::cout << "foo: " << v.which() << "\n";
}

int main()
{
    foo();
    foo({});
    foo(Variant{});
    foo(boost::blank{});
    
    static constexpr boost::blank blank;
    foo(blank);
    
    foo(42);
    foo("LtUaE");
}

版画

foo: 0
foo: 0
foo: 0
foo: 0
foo: 0
foo: 1
foo: 2