使用模板重载现有函数是否是一种不好的做法
Is it bad practice to overload an existing function with 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>()
调用默认模式?
对于您的特定问题,您可以执行以下操作:
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 示例。
相关文章:
- 有符号的int和int-有没有一种方法可以在C++中区分它们
- 有一个打印语句的函数是一种糟糕的编程实践吗
- 有没有一种方法可以创建一个带有哈希表的数据库,该哈希表具有恒定时间查找功能
- 有没有一种方法可以在编译时获得作用域类名
- 对于C++中使用智能指针的指针算术限制,有没有一种变通方法
- 一种在C++中读取TXT配置文件的简单方法
- 有没有一种方法可以测量c++程序的运行时内存使用情况
- 有没有一种方法可以使用placement new将堆叠对象分配给分配的内存
- 在调用接收数组的方法时,模板化数组大小是不是一种糟糕的做法
- 一种优雅或至少可行的方法,用于使用和接受具有重载方法和运算符的不同大小的文字数组常量
- 一种类型特征,标识哪个类提供通过重载解析选择的函数
- 使用模板重载现有函数是否是一种不好的做法
- 重载输入/输出运算符,为什么它以这种方式工作而不是以另一种方式工作
- 重载函数时使用临时对象作为参数是一种好的做法吗
- 重载一个函数同时获取指针或引用是不是一种糟糕的做法
- 是否有一种方法可以重载operator=来为右边的函数提供特定的行为?
- 将右值引用作为左操作数重载加法操作符被认为是一种良好的做法
- c++以一种有效的方式重载plus
- 是否可以像重载另一种类型的成员访问运算符一样解析静态成员
- 使用值包装器和 operator() 重载来简化 getter/setter 设计:这是一种危险的做法