我有一个函数int foo()
,然后我意识到有两个不同的模式会比较好,比如快速和默认,我设计下面的模板。
template<typename T>
int foo() { doDefaultStuff; }
template<> int foo<FastMode> { doFastStuff; }
然后我尝试调用我的模板,如
if (enable_fast_mode)
a = foo<FastMode>();
else
a = foo<>();
但else
部分不会编译为no matching function for call to 'foo()'
宣布int foo()
和template<> int foo()
是不好的做法,
或者我应该使用int foo<void>()
调用默认模式?
答案 0 :(得分:3)
针对您的具体问题,您可以执行以下操作:
enum class Mode
{
Slow,
Fast,
Default
};
template<Mode T = Mode::Default>
int foo() { ...; }
template<>
int foo<Mode::Fast>() { ...; }
这使得foo<>()
之类的调用成为可能,因为它默认为Mode::Default
。
答案 1 :(得分:0)
为了尝试回答一般功能,根据Herb Sutter,不建议专门化功能模板,这里是article。混合重载和专业化时可能会遇到意外情况,请参阅文章中的Dimov / Abrahams示例。