dan*_*ani 6 c++ fold-expression c++17
我有一个函数来检查是否std::string包含子字符串.我将字符串传递给std::string_view,因此不会发生任何复制.
bool containsSubstr(std::string_view str, std::string_view substr)
{
return str.find(substr) != std::string::npos;
}
Run Code Online (Sandbox Code Playgroud)
我现在想要使用新的C++ 17折叠表达式来创建一个函数,以检查字符串是否包含多个子字符串.再一次,我想通过std::string_views 传递它们.
我怎样才能做到这一点?
template<typename... Substrs>
bool containsAllSubstr(std::string_view str, Substrs... substrs)
{
return (containsSubstr(str, substrs) && ...);
}
Run Code Online (Sandbox Code Playgroud)
据我所知,上面的版本将子字符串作为它们所来自的类型.所以a std::string将被复制.我该如何修改类型std::string_view?就像是:
template<> // does not compile
bool containsAllSubstr(std::string_view str, std::string_view... substrs)
{
return (containsSubstr(str, substrs) && ...);
}
Run Code Online (Sandbox Code Playgroud)
Bar*_*rry 10
您不能拥有特定类型的函数参数包.但这很好(一旦你添加const&):
template <typename... Substrs>
bool containsAllSubstr(std::string_view str, Substrs const&... substrs)
{
return (containsSubstr(str, substrs) && ...);
}
Run Code Online (Sandbox Code Playgroud)
这将不会制作任何副本,如果你传递的东西不能转换为不会编译string_view.如果你想使SFINAE友好,可以添加一个条件:
template <typename... Substrs,
std::enable_if_t<(std::is_convertible_v<Substrs const&, std::string_view> && ...), int> = 0>
bool containsAllSubstr(std::string_view str, Substrs const&... substrs)
{
return (containsSubstr(str, substrs) && ...);
}
Run Code Online (Sandbox Code Playgroud)
或者,如果您对语法稍有改动,可以使用数组:
template <size_t N>
bool containsAllSubstr(std::string_view str, std::string_view (&substrs)[N]);
Run Code Online (Sandbox Code Playgroud)
但是你实际上并没有立即拥有一个包.但是,你可以写一个循环.或者,如果您根本不需要编译时大小:
bool containsAllSubstr(std::string_view str, std::initializer_list<std::string_view> substrs);
Run Code Online (Sandbox Code Playgroud)