c++ - 强制特定类型的函数模板/函数重载

标签 c++ templates overloading

我有一个函数

foo(int, int, int, int/long long/_int64/double/long double/char *, int ONLY IF previous char * - otherwise unneeded)

问题是,由于需要字符串复制,char * 实现与值类型不同。是的,这是旧代码的接口(interface),所以我不能使用 std::string :/

目前,我已经把它作为一个模板,以及一个带有额外参数的 char * 函数重载。但是,其他类型的所有操作在 char * 上也有效,因此如果调用者忘记了最后一个参数,该函数将默默地匹配模板,从而产生错误的逻辑。

有什么方法可以强制在函数模板中使用重载/使用默认参数/允许特定类型使用不同签名(额外参数)而不默默匹配较小签名的东西?

更多: 尚无访问 C++11 的权限,但我很乐意看到使用它来帮助插入采用的建议。 没有提升,但同上

我也试过

return_type foo(int,int,int,typename std::enable_if<!std::is_pointer<T>::value, T>::type & value2update)

没有任何运气。然后它声称带有双参数 & 的调用无法匹配。

最佳答案

您可以让链接器帮助您。在 header 中声明但不定义您的函数模板和 char* 重载:

template<typename T>
foo(int, int, int, T);
foo(int, int, int, char*, int);

在实现文件(.cpp/.cc)中,同时实现:

template<typename T>
foo(int, int, int, T) { ... }

foo(int, int, int, char*, int) { ... }

并显式实例化您要接受的类型的版本:

template<>
foo(int, int, int, int);
template<>
foo(int, int, int, long long);
// etc.

如果我的理解正确,ScottLamb 在评论中提出了类似的建议。 header :

foo(int, int, int, int);
foo(int, int, int, long long);
...
foo(int, int, int, char*, int);

执行文件(.cpp/.cc):

namespace {
    template<typename T>
    foo_tmpl(int, int, int, T) { ... }
}

foo(int, int, int, int) { foo_tmpl(...); }
foo(int, int, int, long long) { foo_tmpl(...); }
....
foo(int, int, int, char*, int) { ... }

从使用 header 的人的角度来看,这是更可取的(他们可以立即看到哪些重载可用),但在实现方面需要做更多的工作。

关于c++ - 强制特定类型的函数模板/函数重载,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15168704/

相关文章:

c++ - 检查模板参数是否继承自类

C++运算符重载——指针、乘法

方案:重载内置程序,一般重载

c++ - 从 BLOB 字段写入 JPEG 图像

c++ - 将返回类型推导为模板参数方法的类型

c++ - popen()如何工作以及如何在Linux上将其实现为C++代码?

c++ - 简化模板

c++ - 如何解决用文字 0 和指针调用重载函数的歧义

c++ - std::vector 在 push_back 期间多次调用析构函数?

c++ - 如何编写快速(低级)代码?