関数ポインターをパラメーターとして受け取る関数があり、そのパラメーターにはデフォルトの引数があるとします。
template <typename T>
T* default_construct()
{
return new T();
}
template <typename T>
void register(T* (*construct)() = default_construct<T>)
{
// Save that function pointer for later
}
Foo
classでregister を使用したいのですFoo
が、デフォルトのコンストラクターがないため、動作しませんdefault_construct
。明らかな解決策は、次のようにすることです。
Foo* construct_Foo()
{
return new Foo("String argument", 123);
}
SomeFunc()
{
// ...
register<Foo>(construct_Foo);
// ...
}
しかし、それはうまくいきません。register<Foo>
1 か所でしか呼び出されず、使用する関数が渡されてもdefault_construct<Foo>
、コンパイラによってインスタンス化され、コンパイラ エラーが発生します。慣れないから飛ばした方が良さそうですが、そうでもないのではないでしょうか。
default_construct
デフォルトの引数として使用されているときにインスタンス化されないようにする方法はありますか? 私が考えることができる唯一の解決策は、それをテンプレートに入れることですが、より良い解決策があるはずです.