Ale*_*lex 5 c++ templates default-arguments
假设我有一个函数将函数指针作为参数,该参数有一个默认参数.
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
}
Run Code Online (Sandbox Code Playgroud)
假设我想在我的类上使用register Foo,但是Foo没有默认的构造函数,所以我default_construct不会对它起作用.显而易见的解决方案是做这样的事情:
Foo* construct_Foo()
{
return new Foo("String argument", 123);
}
SomeFunc()
{
// ...
register<Foo>(construct_Foo);
// ...
}
Run Code Online (Sandbox Code Playgroud)
但这不起作用.即使register<Foo>可能只在一个地方调用,并且它传递了一个要使用的函数,default_construct<Foo>仍然会被编译器实例化,并且我得到编译器错误.似乎因为它永远不会被使用,它应该被跳过,但我想情况并非如此.
default_construct当它被用作默认参数时,有什么方法可以防止被实例化?我能想到的唯一解决方案是将它放在模板中,但似乎应该有更好的解决方案.
这是一个解决问题的解决方案,因为它不使用默认参数:
template <typename T>
T* default_construct()
{
return new T();
}
template <typename T>
void register(T* (*construct)())
{
// Save that function pointer for later
}
template<typename T>
void register()
{
register<T>(default_construct<T>);
}
Run Code Online (Sandbox Code Playgroud)
注意,这register是一个C++关键字:)
| 归档时间: |
|
| 查看次数: |
206 次 |
| 最近记录: |