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