のは、私はこのように定義されたクラスFunctionWrapper
があるとしましょう:暗黙的な変換を防止しますが、リストの初期化を許可しますか?
struct FunctionWrapper
{
FunctionWrapper(std::function<void()> f);
// ... plus other members irrelevant to the question
};
私はリストの初期化を使用して、それがある(FunctionWrapper
へstd::function<void()>
から暗黙的な変換を防ぐために好きですが、ブレースの初期化構文を使用してFunctionWrapper
を構築できるようにしたいです1つの引数で)。言い換えれば、私はこれが欲しいです:
void foo();
void wrap(FunctionWrapper);
wrap(foo); // (1) error
wrap({foo}); // (2) OK
wrap(FunctionWrapper{foo}); // (3) OK
達成する方法はありますか?上記のクラスを定義した方法はそうではありません。暗黙的な変換が可能なので、(1)コンパイルします。
私は、コンストラクタにexplicit
を追加する場合:
struct FunctionWrapper
{
explicit FunctionWrapper(std::function<void()> f);
// ... plus other members irrelevant to the question
};
それは「行き過ぎ」行くように、それは、どちらかの助けにはならないと禁止し(2)と同様に(1)。
「中盤」を達成し、(1)エラーが発生している間に(2)コンパイルする方法はありますか?
'std :: initializer_list'パラメータを取る明示的なコンストラクタを追加します。 –
あなたはinitializer_listを使うことができますが、引数の数をランタイムチェックするしかないでしょう...おそらくテンプレートはconst配列とstatic_assertをテンプレートサイズで受け取ります...しかしそれはちょっと醜い – Hcorg
@Hcorgは[this](http: /melpon.org/wandbox/permlink/0rFgVYD8XKYwVlC1)二重ブレースの初期化が必要ですか? –