5

関数ポインターをパラメーターとして受け取る関数があり、そのパラメーターにはデフォルトの引数があるとします。

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
}

Fooclassで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デフォルトの引数として使用されているときにインスタンス化されないようにする方法はありますか? 私が考えることができる唯一の解決策は、それをテンプレートに入れることですが、より良い解決策があるはずです.

4

1 に答える 1

6

デフォルトの引数を使用しないため、問題を解決する1つのソリューションを次に示します。

template <typename T>
T* default_construct()
{
    return new T();
}

template <typename T>
void register(T* (*construct)())
{
    // Save that function pointer for later
}

template<typename T>
void register()
{
    register<T>(default_construct<T>);
}

ただし、それregisterはC++のキーワードであることに注意してください:)

于 2011-08-10T05:14:46.620 に答える