基于char类型的string_view模板

时间:2018-06-21 21:27:21

标签: c++ c++17

我正在尝试创建一个将字符串或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? 有办法吗?

1 个答案:

答案 0 :(得分:0)

您不需要模板。我想你只是想要:

bool starts_with(std::string_view str, std::string_view prefix);

模板的问题在于模板会演绎-这就是它们的作用。但是您不想推论,您确实想转换。您想将stringchar 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;
}