C++:如何在 std::optional 上初始化和调用方法?
C++: How to initialize and call a method on std::optional?
让我们考虑一下这段代码
std::optional<flat_set<int>> object;
void f(int v) {
if (!object.has_value()) {
object = flat_set<int>{};
}
object->insert(v);
}
如何避免 if 部分?
有什么方法可以通过调用一个方法将函数体写成一行吗?
除非你绝对知道可选值有一个值(如果你知道,为什么要使用可选的?)
您可以将条件部分包装成 lambda/function:
#include <optional>
#include <boost/container/flat_set.hpp>
std::optional<boost::container::flat_set<int> > objects;
void f(int _v)
{
auto assure = [&]() -> decltype(auto)
{
if (objects.has_value())
return *objects;
else
return objects.emplace();
};
assure().insert(_v);
}
另一种方式...
#include <optional>
#include <boost/container/flat_set.hpp>
std::optional<boost::container::flat_set<int> > objects;
template<class T>
auto assure_contents(std::optional<T>& opt) -> T&
{
if (opt.has_value())
return *opt;
else
return opt.emplace();
}
void f(int _v)
{
assure_contents(objects).insert(_v);
}
让我们考虑一下这段代码
std::optional<flat_set<int>> object;
void f(int v) {
if (!object.has_value()) {
object = flat_set<int>{};
}
object->insert(v);
}
如何避免 if 部分? 有什么方法可以通过调用一个方法将函数体写成一行吗?
除非你绝对知道可选值有一个值(如果你知道,为什么要使用可选的?)
您可以将条件部分包装成 lambda/function:
#include <optional>
#include <boost/container/flat_set.hpp>
std::optional<boost::container::flat_set<int> > objects;
void f(int _v)
{
auto assure = [&]() -> decltype(auto)
{
if (objects.has_value())
return *objects;
else
return objects.emplace();
};
assure().insert(_v);
}
另一种方式...
#include <optional>
#include <boost/container/flat_set.hpp>
std::optional<boost::container::flat_set<int> > objects;
template<class T>
auto assure_contents(std::optional<T>& opt) -> T&
{
if (opt.has_value())
return *opt;
else
return opt.emplace();
}
void f(int _v)
{
assure_contents(objects).insert(_v);
}