我有一个函数
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/