假设我有一个函数,它将函数指针作为参数,并且该参数有一个默认参数。
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
}
假设我想在我的 class 上使用 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
当它被用作默认参数时,有什么方法可以防止被实例化?我能想到的唯一解决方案是将它放在模板中,但似乎应该有更好的解决方案。