gpt4 book ai didi

c++ - 使用模板和字符串?

转载 作者:太空狗 更新时间:2023-10-29 20:37:07 24 4
gpt4 key购买 nike

我有一个方便的函数,可以将字符串拆分成多个部分。实现对我的问题并不重要。

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 吗?

最佳答案

std::stringconst char* 是不同的类型,所以在

tsplit(str, " ", vec_strPart);

如果您希望 StringTypestd::stringconst char*,这是不明确的。

解决这个问题的一种方法是为每个参数设置模板:

template <typename String, typename InputString, typename PatternString>
std::vector<String>& tsplit(const InputString & input,
const PatternString& pattern,
std::vector<String>& res);

另一种方法是只对一个参数进行推导,并使一些参数不可推导:

// Helper
template <typename T> struct non_deducible { using type = t; };
template <typename T> using non_deducible_t = typename non_deducible<T>::type;

template <typename String>
std::vector<String>& tsplit(const non_deducible_t<String>& input,
const non_deducible_t<String>& pattern,
std::vector<String>& res);

关于c++ - 使用模板和字符串?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36004573/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com