我有一個方便的功能,將字符串拆分爲多個部分。實施對我的問題並不重要。使用模板和字符串?
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