Предотвращение создания неиспользуемых аргументов функции по умолчанию - PullRequest
5 голосов
/ 10 августа 2011

Допустим, у меня есть функция, которая принимает указатель функции в качестве параметра, и этот параметр имеет аргумент по умолчанию.

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
}

Допустим, я хочу использовать register в моем классе Foo, но Foo не имеет конструктора по умолчанию, поэтому мой default_construct не будет работать с ним. Очевидное решение - сделать что-то вроде этого:

Foo* construct_Foo()
{
    return new Foo("String argument", 123);
}

SomeFunc()
{
    // ...
    register<Foo>(construct_Foo);
    // ...
}

Но это не работает. Даже если register<Foo> можно вызывать только в одном месте, и ему передается используемая функция, default_construct<Foo> все еще создается экземпляром компилятором, и я получаю ошибки компилятора. Кажется, что так как он никогда не используется, его следует пропустить, но я думаю, что это не так.

Есть ли способ предотвратить создание экземпляра default_construct, когда он используется в качестве аргумента по умолчанию? Единственное решение, которое я могу придумать, - это вставить его в шаблон, но, похоже, должно быть лучшее решение.

1 Ответ

6 голосов
/ 10 августа 2011

Вот одно решение, которое решает проблему, потому что не использует аргументы по умолчанию:

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 ++:)

...