Допустим, у меня есть функция, которая принимает указатель функции в качестве параметра, и этот параметр имеет аргумент по умолчанию.
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
, когда он используется в качестве аргумента по умолчанию? Единственное решение, которое я могу придумать, - это вставить его в шаблон, но, похоже, должно быть лучшее решение.