5

私は std::strings を次のように初期化することに慣れてきました。

std::string my_string = "hello";

2 つの型の間に明示的な変換がないため、以下は機能しません。

boost::optional<std::string> my_optional_string = "hello";

ただし、これは機能します。

boost::optional<std::string> my_optional_string = std::string("hello");

さて、暗黙的に呼び出された単一引数のコンストラクターをデイジーチェーン接続して、2 番目の形式を許可する方法はありませんか? 私が質問する理由は (詳細について煩わされたくないのですが)、オプションのメンバーを設定するクラスがたくさんあるからです。すべてを明示的に入力しなければならないのは負担に思えます (私自身はそれほど心配していませんが、オープン ソース API に取り組んでおり、ユーザーにできるだけ快適な環境を提供したいと考えています)。任意の提案をいただければ幸いです。


編集:申し訳ありませんが、私はこれが初めてで、より明確なコード例を提供する必要がありました。次のように、オプションのメンバーを設定するいくつかのクラス (自分でモデル化していない、C++ で実装しただけ) があります。

Class Class1 {
public:
    Class1(const boost::optional<std::string>& arg_1, /*... ,*/ const boost::optional<std::string>& arg_n );
};

API ユーザーが指定できるようにしたいのは、次のとおりです。

Class1 my_class("hello","there",NULL,"stackoverflow");
/* ( Note: NULL is actually risky here, as some classes might also have members of type boost::optional<int> ) */

そしてそうではありません:

Class1 my_class(std::string("hello"),/*or*/boost::optional<std::string>("there"),boost::optional<std::string>(),std::string("stackoverflow"));

再度、感謝します。

4

2 に答える 2

7

コンストラクターがマークされているので、コンストラクターをexplicit明示的に呼び出さないのはなぜですか?boost::optional<std::string> my_optional_string("hello");

編集後

Xeo はすでにソリューションを提供しています。おそらく、コンストラクターにデフォルトの引数を使用することもできます。

Class1(boost::optional<std::string> = boost::optional<std::string>(), /*...*/)
Class1(std::string arg1, /*...*/) : 
member1(arg1), /*member2(arg2), etc.*/

次に、次のClass1ようにします。

Class1 my_class;
Class1 my_class("hello", "there"); // Rest of arguments use boost::optional

しかし、多くのコンストラクターと可能性を提供する必要がある場合、おそらく上記は適切な解決策ではない可能性があります。それをテンプレート化して、記述しなければならないコードの量を削減することを検討できます。

于 2012-07-27T03:07:23.063 に答える
1

最も簡単な解決策: 複数のコンストラクターを提供しchar const*ます。std::stringboost::optional

ただし、すべての引数に対してこの可能性が必要な場合は、ctor をテンプレート化する方がはるかに優れています。

template<class A1, class A2, class A3 /*, ..., class AN*/>
Class1(A1 const& a1, A2 const& a2, A3 const& a3 /*, ... , AN const& aN*/)
  : _member1(a1)
  , _member2(a2)
  , _member3(a3)
/*, ...
  , _memberN(aN)*/
{ /* ... */ }

NULLところで、未使用の を 渡すべきではありませんがoptionalboost::none.

于 2012-07-29T10:30:36.703 に答える