【发布时间】:2017-11-13 09:14:15
【问题描述】:
我知道了:
json& add(char* key, char* value) {
s.append("\"").append(key).append("\":\"").append(value).append("\",");
return *this;
}
json& add(char* key, const char* value) {
s.append("\"").append(key).append("\":\"").append(value).append("\",");
return *this;
}
template <typename vt>
json& add(char* key, vt value) {
s.append("\"").append(key).append("\":").append(std::to_string(value)).append(",");
return *this;
}
所以这个函数有 3 个重载。
第一个应该处理一个 char* 值。
最后一个应该处理所有的数字类型,如 uint_8t、int_8t、uint16_t ....float、double
如果我使用这个功能,例如:
void test(json obj, char* value) {
obj.add("test", value);
}
然后一切正常,只有第一个和最后一个重载。但是,如果我尝试这样做:
void test(json obj) {
obj.add("test", "blah");
}
然后它将尝试使用最后一个重载(带有模板的那个)而不是 char* 一个,因为从技术上讲,我正在将一个 const char* 传递给它。
所以现在我需要为此设置中间重载。
问题是 - 有没有办法为它应该处理的模板定义一系列类型?将 vt 限制为我提到的数字类型?那应该将编译器转移到使用 char* 重载,而我不需要 const char* 一个。
【问题讨论】:
-
你的意思是你不需要
char*one,对吧? -
@KarstenKoop 要么对我有用
-
将一个或多个参数转换为所需重载所需的类型。注意没有“有点模棱两可”这样的东西:有模棱两可的和非模棱两可的。
-
添加到模棱两可/非模棱两可的评论,详细信息在这里en.cppreference.com/w/cpp/language/overload_resolution在“最佳可行功能”下。第 3 点说非模板优于模板,但在这种情况下,如果您没有 const char* 重载,则将模板作为 const char* 转换为 char 不是可行的转换。