使用模板重载现有函数是否是一种不好的做法

Is it bad practice to overload an existing function with templates?

本文关键字:一种 重载 是否是 函数      更新时间:2023-10-16

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

对于您的特定问题,您可以执行以下操作:

enum class Mode
{
   Slow,
   Fast,
   Default
};
template<Mode T = Mode::Default>
int foo() { ...; }
template<> 
int foo<Mode::Fast>() { ...; }

这使得像foo<>()这样的调用成为可能,因为它默认为 Mode::Default .

为了尝试回答一般功能,根据 Herb Sutter 的说法,不建议专门化函数模板,这里是文章。在混合重载和专用化时,您可能会遇到意外情况,请参阅本文中的 Dimov/Abrahams 示例。

相关文章: