Предотвращение создания экземпляров неиспользуемых аргументов функции по умолчанию

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

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 , но Foo не имеет конструктора по умолчанию, поэтому моя default_construct не будет работать в теме. Очевидное решение - сделать что-то вроде этого:

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

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

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

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

5
задан Alex 10 August 2011 в 05:10
поделиться