用三元运算符初始化 boost::optional
Initialize boost::optional with ternary operator
是一种初始化可选的方法,如:
bool conditional = true;
boost::optional<int> opt = conditional ? 5 : boost::none;
为什么会出现这个错误?:
main.cpp:31:31: error: operands to ?: have different types ‘int’ and ‘const boost::none_t’
boost::make_optional(cond ? 5 : boost::none);
| ~~~~~^~~~~~~~~~~~~~~~~
通过简单的 if else
我可以做到这一点:
boost::optional<int> opt;
if (cond)
opt = 5;
else
opt = boost::none;
三元运算符要求左右为相同(或可转换)类型。 none_t
和 int
不是同一类型。你或许可以做到 cond ? boost::optional<int>(5) : boost:none
我不使用 boost,所以只是根据 std::optional
猜测语法,但以下内容确实有效:
std::optional<int> opt = cond ? std::optional<int>(5) : std::nullopt;
三元运算符的结果需要是单一类型。 :
的左参数和右参数需要是同一类型,或者可转换为同一类型。
?a:b
要求 a
和 b
具有共同的类型以转换为 C++ 可以推导的类型。
boost::none
和 5
没有这个。
auto opt = conditional ? boost::optional<int>(5) : boost::none;
有效
auto opt = conditional ? 5 : boost::optional<int>();
也有效。
你也可以写一个助手
auto opt = maybe_optional( conditional, 5 );
哪里
template<class T>
boost::optional<T> maybe_optional( bool b, T t ) {
if (b) return std::forward<T>(t);
return boost::none;
}
是一种初始化可选的方法,如:
bool conditional = true;
boost::optional<int> opt = conditional ? 5 : boost::none;
为什么会出现这个错误?:
main.cpp:31:31: error: operands to ?: have different types ‘int’ and ‘const boost::none_t’
boost::make_optional(cond ? 5 : boost::none);
| ~~~~~^~~~~~~~~~~~~~~~~
通过简单的 if else
我可以做到这一点:
boost::optional<int> opt;
if (cond)
opt = 5;
else
opt = boost::none;
三元运算符要求左右为相同(或可转换)类型。 none_t
和 int
不是同一类型。你或许可以做到 cond ? boost::optional<int>(5) : boost:none
我不使用 boost,所以只是根据 std::optional
猜测语法,但以下内容确实有效:
std::optional<int> opt = cond ? std::optional<int>(5) : std::nullopt;
三元运算符的结果需要是单一类型。 :
的左参数和右参数需要是同一类型,或者可转换为同一类型。
?a:b
要求 a
和 b
具有共同的类型以转换为 C++ 可以推导的类型。
boost::none
和 5
没有这个。
auto opt = conditional ? boost::optional<int>(5) : boost::none;
有效
auto opt = conditional ? 5 : boost::optional<int>();
也有效。
你也可以写一个助手
auto opt = maybe_optional( conditional, 5 );
哪里
template<class T>
boost::optional<T> maybe_optional( bool b, T t ) {
if (b) return std::forward<T>(t);
return boost::none;
}