我正在尝试创建一个将字符串或char数组与char数组或其他字符串进行比较的函数,并且希望它处理utf8和ascii格式。
这是该代码的测试版:
bool equals (const std::string& To, const std::string& What)
{
return ! To.compare (0, What.length (), What);
}
这可能会在运行时创建一个或2个字符串,这可能会产生额外的费用。它仅处理ascii字符串。 我正在尝试将其转换为:
template <typename CharT>
bool equals (const std::basic_string_view<CharT> To, const
std::basic_string_view<CharT> What)
{
return ! To.compare (0, What.length (), What);
}
这确实使用gcc8进行编译,至少在第一个参数是std :: string且第二个参数是const char *的情况下。由于basic_string_view不是basic_string的父级。
./test.cpp:14:28: error: no matching function for call to 'equals(std::__cxx11::basic_string<char>&, const char [6])'
if (equals (prop, "Prop="))
^
./test.cpp:5:6: note: candidate: 'template<class T, class C> bool equals(std::basic_string_view<C>, std::basic_string_view<C>)'
bool equals (const std::basic_string_view<C> iTo, const std::basic_string_view<C> iWhat)
^~~~~~
./test.cpp:5:6: note: template argument deduction/substitution failed:
./test.cpp:14:28: note: 'std::__cxx11::basic_string<char>' is not derived from 'std::basic_string_view<C>'
if (equals (prop, "Prop="))
所以我需要对模板说什么是CharT? 有办法吗?
答案 0 :(得分:0)
您不需要模板。我想你只是想要:
bool starts_with(std::string_view str, std::string_view prefix);
模板的问题在于模板会演绎-这就是它们的作用。但是您不想推论,您确实想转换。您想将string
或char const*
或其他任何格式转换为string_view
。因此,没有模板,只有转换。
请注意,在C ++ 20中,此成员函数将存在:
bool starts_with(std::string_view str, std::string_view prefix) {
return str.starts_with(prefix);
}
直到:
bool starts_with(std::string_view str, std::string_view prefix) {
return str.size() >= prefix.size() && str.compare(0, prefix.size(), prefix) == 0;
}