FunctionWrapper
次のように定義されたクラスがあるとしましょう:
struct FunctionWrapper
{
FunctionWrapper(std::function<void()> f);
// ... plus other members irrelevant to the question
};
std::function<void()>
からへの暗黙的な変換を防止したいのですFunctionWrapper
が、ブレースの初期化構文を使用して を構築できるようにFunctionWrapper
します (つまり、単一の引数でリストの初期化を使用します)。言い換えれば、私はこれが欲しい:
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
};
それは「行き過ぎ」になり、(1) と同様に (2) も許可しないため、どちらも役に立ちません。
「中間点」を達成し、(1) がエラーを生成している間に (2) コンパイルする方法はありますか?