【发布时间】:2013-03-01 23:36:43
【问题描述】:
我有一个函数
foo(int, int, int, int/long long/_int64/double/long double/char *, int ONLY IF previous char * - otherwise unneeded)
问题是,由于需要字符串副本,char * 的实现与值类型不同。是的,这是旧代码的接口,所以我不能使用 std::string :/
目前,我将它作为一个模板,以及一个用于 char * 的函数重载,并带有额外的参数。但是,其他类型的所有操作在 char * 上也是有效的,所以如果调用者忘记了最后一个参数,函数会默默地匹配模板,从而产生错误的逻辑。
有什么方法可以强制在函数模板中使用重载/使用默认参数/允许特定类型的不同签名(额外参数)而无需静默匹配较小的签名?
更多: 尚无法访问 C++11,但我愿意看到使用它来帮助推动采用的建议。 没有提升,但和上面一样
我也试过了
return_type foo(int,int,int,typename std::enable_if<!std::is_pointer<T>::value, T>::type & value2update)
没有任何运气。然后它声称带有双 & 参数的调用无法匹配。
【问题讨论】:
-
“否则不需要”到底是什么意思?这应该可以通过重载轻松实现。
-
我假设额外的
int是一个长度?您可以使用StringPiece 来完全避免使用特殊外壳吗? -
@Xeo,是的,我只是想避免每种类型的代码重复,所以想模板化其他类型,它们都共享完全相同的代码。 @ Scott Lamb,是的,可以肯定这是一个有效的——而且可能是最好的——选择。但是,这种集成将发生在代码库中大约 3000 个位置,因此我希望避免在调用代码中添加 StringPiece 创建逻辑。我只是希望我做错了什么来强制专业化 - 必须更彻底地调查 Thomas 的答案
-
如果您想这样做,您可以查看clang tools 进行自动重构。我听说这种乏味的改变很棒,虽然我自己从未尝试过。
标签: c++ templates overloading