我的代码中有一个带有类型签名的重载函数:
void foo(std::string);
void foo(std::vector<std::string>);
我希望 foo 的用户能够使用字符串或字符串列表调用它
//Use case 1
foo("str");
//Use case 2
foo({"str1","str2","str3"});
foo({"str1","str2","str3","str4"});
问题是当调用者将两个字符串传入 foo 的初始化列表时。
//Problem!
foo({"str1","str2"});
这个对 foo 的调用是模棱两可的,因为它匹配两个类型签名。这是因为显然{"str1","str2"}
是一个有效的构造函数std::string
所以我的问题是,我可以在 foo 的声明或实现中做些什么,这样我就可以维护上面描述的 API,而不会遇到这种模棱两可的构造函数案例。
我不想定义自己的字符串类,但我可以定义其他东西,而不是vector<string>
只要它可以用字符串的初始化列表进行初始化。
只是出于好奇,为什么字符串构造函数接受{"str1","str2"}
?