定义 boost 变体类型以传递明确的空值
Define boost variant type to pass explicitly empty values
我想要 boost::variant
为空状态。所以我定义了一个 boost::variant
和 boost::blank
作为第一个选择。但是后来我想将其作为函数参数传递:
void f(Variant v);
...
void g()
{
f(boost::blank{});
}
因为牙套,看起来不太好看。如果接受 boost::none
:
似乎更好
void g()
{
f(boost::none);
}
但我不认为我在任何地方见过 boost::variant<boost::none_t, ...>
。 boost::none_t
是 boost::optional
的卫星。可以与 boost::variant
一起使用吗?
您可以只使用默认构造,这将初始化第一个元素类型。
或者您可以定义自己的 boost::blank
:
类型常量
#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
我想要 boost::variant
为空状态。所以我定义了一个 boost::variant
和 boost::blank
作为第一个选择。但是后来我想将其作为函数参数传递:
void f(Variant v);
...
void g()
{
f(boost::blank{});
}
因为牙套,看起来不太好看。如果接受 boost::none
:
void g()
{
f(boost::none);
}
但我不认为我在任何地方见过 boost::variant<boost::none_t, ...>
。 boost::none_t
是 boost::optional
的卫星。可以与 boost::variant
一起使用吗?
您可以只使用默认构造,这将初始化第一个元素类型。
或者您可以定义自己的 boost::blank
:
#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