我有一个功能强制功能模板/函数重载为特定类型
foo(int, int, int, int/long long/_int64/double/long double/char *, int ONLY IF previous char * - otherwise unneeded)
问题是,字符*实现要比值类型,由于进行字符串拷贝不同。是的,这是一个旧代码的接口,所以我不能使用std :: string:/
目前,我已经把它作为模板,并且有一个函数重载char *,并带有额外的参数。但是,其他类型的所有操作在char *上也是有效的,所以如果调用者忘记了最后一个参数,则该函数默默地匹配模板,而不是产生错误的逻辑。
有没有什么办法可以强制使用函数模板中的重载/使用默认参数/这将允许特定类型的不同签名(额外参数),而不会默认匹配较小的签名?
更多: 尚未获得C++ 11的许可,但我很乐意看到使用它来帮助推动采用的建议。 没有提升,但与上面相同
我也曾尝试
return_type foo(int,int,int,typename std::enable_if<!std::is_pointer<T>::value, T>::type & value2update)
没有任何的运气。然后它声称带双&参数的呼叫无法匹配。
你是什么意思,“否则不需要”?这应该通过重载轻松实现。 – Xeo 2013-03-01 23:42:01
我假设额外的'int'是一个长度?你可以采取[StringPiece](http://code.google.com/p/re2/source/browse/re2/stringpiece.h)来避免完全需要特殊外壳? – 2013-03-01 23:43:07
@Xeo,是的,我只是想避免每种类型的代码重复,所以想要templatize其他类型,这些都共享完全相同的代码。 @ Scott Lamb,是的,肯定这是一个有效的 - 也许是最好的选择。然而,这种集成将发生在代码库的大约3000个地方,所以不得不在调用代码中添加StringPiece创建逻辑,这是我想避免的。我只是希望有一些事情我做错了强制专业化 - 必须更彻底地调查Thomas的答案 – 2013-03-04 15:39:56