我有一个方便的功能,将字符串拆分为多个部分。实施对我的问题并不重要。使用模板和字符串?
inline std::vector<std::string> & split(const std::string & strInput, const std::string & strPattern, std::vector<std::string> & vec_strPart)
{...}
我想使这个功能的模板化版本,以支持wstrings和其他类型的字符串。但是,如果我这样做
template <class StringType>
inline std::vector<StringType> & tsplit(const StringType & strInput, const StringType & strPattern, std::vector<StringType> & vec_strPart)
{...}
那么它不能如预期般
const std::string str("bla bla blaaaa");
const std::string strPattern(" ");
std::vector<std::string> vec_strPart;
split(str, strPattern, vec_strPart); // works
tsplit(str, strPattern, vec_strPart); // works
split(str, " ", vec_strPart); // works
tsplit(str, " ", vec_strPart); // does not work, StringType is ambiguous
tsplit(str, std::string(" "), vec_strPart); // works but changes client's code
我的问题是,为什么使用字符串常量,而它与untemplated一个工作不与模板版本携手。我的假设是,在未模糊的情况下,存在从char[]
到std::string
的隐式转换,而对于模板,匹配发生在隐式转换之前。
我该如何弥补“模糊性问题”?我是否可以制作tsplit
的专用版本,该版本的转换为std::string
,并调用tsplit
?
也许你可以检查拆分方法中变量的类型(如果不允许修改客户端代码)。看看:http://en.cppreference.com/w/cpp/language/typeid – asalic