使用模板重载现有函数是不好的做法吗?

时间:2017-01-11 09:38:26

标签: c++ templates

我有一个函数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>()调用默认模式?

2 个答案:

答案 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示例。