加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 百科 > 正文

c – 如何使用特定类型的折叠表达式?

发布时间:2020-12-16 03:22:11 所属栏目:百科 来源:网络整理
导读:我有一个函数来检查std :: string是否包含子字符串.我将字符串作为std :: string_view传递,这样就不会发生复制. bool containsSubstr(std::string_view str,std::string_view substr){ return str.find(substr) != std::string::npos;} 我现在想要使用新的C
我有一个函数来检查std :: string是否包含子字符串.我将字符串作为std :: string_view传递,这样就不会发生复制.
bool containsSubstr(std::string_view str,std::string_view substr)
{
    return str.find(substr) != std::string::npos;
}

我现在想要使用新的C 17折叠表达式来创建一个函数,以检查字符串是否包含多个子字符串.再次,我想通过std :: string_views传递它们.

我怎样才能做到这一点?

template<typename... Substrs>
bool containsAllSubstr(std::string_view str,Substrs... substrs)
{
    return  (containsSubstr(str,substrs) && ...);
}

据我所知,上面的版本将把子串作为它们的类型.因此将复制一个std :: string.如何将类型修复为std :: string_view?就像是:

template<> // does not compile
bool containsAllSubstr(std::string_view str,std::string_view... substrs)
{
    return  (containsSubstr(str,substrs) && ...);
}

解决方法

您不能拥有特定类型的函数参数包.但这很好(一旦你添加const&):
template <typename... Substrs>
bool containsAllSubstr(std::string_view str,Substrs const&... substrs)
{
    return  (containsSubstr(str,substrs) && ...);
}

这不会产生任何副本,如果你传递的东西不能转换成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) && ...);
}

或者,如果您对语法稍有改动,可以使用数组:

template <size_t N>
bool containsAllSubstr(std::string_view str,std::string_view (&substrs)[N]);

但是你实际上并没有立即拥有一个包.但是,你可以写一个循环.或者,如果您根本不需要编译时大小:

bool containsAllSubstr(std::string_view str,std::initializer_list<std::string_view> substrs);

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读