gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-11-30 02:56:49 25 4
gpt4 key购买 nike

我有一个函数

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/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com