Допустим, у меня есть функция, которая принимает указатель на функцию в качестве параметра, и этот параметр имеет аргумент по умолчанию.
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);
// ...
}
Но это не работает. Несмотря на то, что register<Foo>
может вызываться только в одном месте и ему передается функция для использования, default_construct<Foo>
по-прежнему создается компилятором, и я получаю ошибки компилятора. Кажется, что, поскольку он никогда не используется, его следует пропустить, но я думаю, что это не так.
Есть ли способ предотвратить создание экземпляра default_construct
, когда он используется в качестве аргумента по умолчанию? Единственное решение, которое я могу придумать, это поместить его в шаблон, но кажется, что должно быть лучшее решение.
default_construct
все равно должно появиться. Используйтеnm somelib | grep default_construct
и используйтеc++filt
для полученных символов, чтобы получить расширенную версию. - person Matthieu M.   schedule 10.08.2011