C++ 中的模板化 is_in() 函数(检查数组是否包含字符串)

And*_*ich 3 c++ arrays string gcc templates

我想做以下事情:

\n
std::string b = "b";\nis_in("a", { "a", "b", "c" });\nis_in("d", { "a", "b", "c" });\nis_in(b, { "a", "b", "c" }); // fails\nis_in(b, std::array{ "a", "b", "c" });\n
Run Code Online (Sandbox Code Playgroud)\n

使用模板

\n
template<typename Element, typename Container>\nbool is_in(const Element& e, const Container& c)\n{\n    // https://stackoverflow.com/questions/20303821/how-to-check-if-string-is-in-array-of-strings\n    return std::find(std::begin(c), std::end(c), e) != std::end(c);\n}\n\ntemplate<typename Element>\nbool is_in(Element e, std::initializer_list<Element> l)\n{\n    // return std::find(std::begin(l), std::end(l), e) != std::end(l);\n    return is_in<Element, std::initializer_list<Element>>(e, l);\n}\n
Run Code Online (Sandbox Code Playgroud)\n

但我收到以下错误(使用 GCC 9.3.0):

\n
no matching function for call to \xe2\x80\x98is_in(std::string&, <brace-enclosed initializer list>)\xe2\x80\x99\n
Run Code Online (Sandbox Code Playgroud)\n

有没有大佬有模板推荐一下?

\n

son*_*yao 7

对于is_in(b, { "a", "b", "c" });,模板形参按照第一个参数Element推导,按照第二个参数推导;他们不匹配。std::stringbconst char*{ "a", "b", "c" }

您可以为 提供两个模板参数is_in,例如

template<typename E1, typename E2>
bool is_in(E1 e, std::initializer_list<E2> l)
{
    // return std::find(std::begin(l), std::end(l), e) != std::end(l);
    return is_in<E1, std::initializer_list<E2>>(e, l);
}
Run Code Online (Sandbox Code Playgroud)

或者使用std::type_identity(自 C++20 起;为 C++20 之前的版本编写一个相当容易)从类型推导中排除第二个函数参数。

template<typename Element>
bool is_in(Element e, std::initializer_list<std::type_identity_t<Element>> l)
{
    // return std::find(std::begin(l), std::end(l), e) != std::end(l);
    return is_in<Element, std::initializer_list<Element>>(e, l);
}
Run Code Online (Sandbox Code Playgroud)