C++ 如何在C+中使用boost::optional重写+;11?

C++ 如何在C+中使用boost::optional重写+;11?,c++,c++11,boost-optional,stdoptional,C++,C++11,Boost Optional,Stdoptional,如何在C++11中重写以下代码以使用boost::optional或boost::none std::unique\u ptr find(std::string键) { 映射{ {“key1”,[]({return std::make_unique();}}, {“key2”,[](){return std::make_unique();}}}; 自动it=m.find(键); 如果(it!=std::end(m)) 返回(it->second()); 其他的 返回空ptr; } 那么,您希望它

如何在C++11中重写以下代码以使用
boost::optional
boost::none

std::unique\u ptr find(std::string键)
{
映射{
{“key1”,[]({return std::make_unique();}},
{“key2”,[](){return std::make_unique();}}};
自动it=m.find(键);
如果(it!=std::end(m))
返回(it->second());
其他的
返回空ptr;
}

那么,您希望它返回值类型而不是指针吗

这在c++17中的
boost::optional
(或
std::optional
)中是不可能的,因为。对于值类型,您只能返回
FooBase
所包含的信息,因此从其中一个派生类型向上转换时将丢失信息

不过,您可以使用C++17标准采用的另一种Boost类型:
Boost::variant
。这是一种类型安全,可以在同一内存空间中保存一组类型中的一种。只需添加一个表示“none”的类型(C++17中的std::monostate的用途和boost中的boost::blank的用途),然后添加每个派生类型:

structbar1{};
结构Bar2{};
使用Bar=boost::variant;
然后你可以像这样重写你的函数:

条查找(标准::字符串键)
{
映射{
{“key1”,[](){returnbar1{};}},
{“key2”,[](){return Bar2{};}}
};
自动it=m.find(键);
如果(it!=std::end(m))
返回(it->second());
其他的
return{};//默认构造第一个变量,在本例中为空
}

我不确定是否将智能指针包装到
可选的
std::unique_ptr
已经有了一个
null
-状态,所以基本上可以将其加倍。想象一下:<代码>如果(Fo&&FoO)需要确保可选的值,并且包装的智能指针是活的…MaMaIOX不是C++ 11 BTWEY。这也可以帮助您不考虑使用STD:函数,切换到无序映射,如果您能够使用c++17切换到字符串视图:比较所有3个版本的分解,请参阅yourself@Yamahari在C++17之前,您已经可以使用或