2013-05-15 5 views
10

基礎タイプTがデフォルトでは構成不可能、コピー不可/移動不可の場合でも、boost::optional<T>を初期化するにはどうすればよいですか?init boost:コピーできないオブジェクトのオプション

は、それは(非参照型のTのために)完全にオブジェクトを構築するためにインプレースoperator newにすべての引数を提供しtemplate< typename... Args > boost::optional<T>::construct(Args && ...args)のようないくつかのメンバ関数を、持っている任意のセマンティックな理由によりboost::optionalのために禁止されていますか?バリアントは、std::make_shared<T>のような非メンバ関数を持つことです。

私の問題は、std::unique_ptr/std::shared_ptrの使用によって解決することができることを、私には思えるが、この場合には、私の質問は:「なぜboost::optional進展が凍結されています?」。

答えて

14

boost::optionalは、in-place factoriesを使用してコピー不可能なタイプで初期化することができます。

具体的には、このようにそれらを使用することができます。

#include <boost/optional.hpp> 
#include <boost/utility/in_place_factory.hpp> 

class MyType : private boost::noncopyable 
{ 
public: 
    MyType(T1 const& arg1, T2 const& arg2); 
} 
... 
boost::optional<MyType> m_var; 
... 
m_var = boost::in_place(arg1, arg2); 
... 

C++ 14では、この問題に対するより良い解決策になる提案std::make_optionalがあります。しかし、これはBoost.Optionalでは実装されていません。

+0

デフォルトの構成可能なものは何ですか? boost :: in_placeを使用せずにオプションで非コピー可能なboost ::を構築する方法はありますか?私の様々な試みはコンパイルに失敗しました – Geronimo

関連する問題