【发布时间】:2016-03-15 07:01:20
【问题描述】:
我有一个方便的函数,可以将字符串拆分为多个部分。实施对我的问题并不重要。
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
我的问题是为什么使用字符串常量不适用于模板版本,而它适用于未模板版本。我的假设是,在未模板化的情况下,存在从 char[] 到 std::string 的隐式转换,而对于模板,匹配发生在隐式转换之前。
如何解决“歧义问题”?我可以制作一个专门的tsplit 版本来转换为std::string 并调用tsplit吗?
【问题讨论】:
-
也许你可以在 split 方法中检查变量的类型(如果不允许修改客户端代码)。看看:en.cppreference.com/w/cpp/language/typeid