And*_*ich 3 c++ arrays string gcc templates
我想做以下事情:
\nstd::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" });\nRun Code Online (Sandbox Code Playgroud)\n使用模板
\ntemplate<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}\nRun Code Online (Sandbox Code Playgroud)\n但我收到以下错误(使用 GCC 9.3.0):
\nno matching function for call to \xe2\x80\x98is_in(std::string&, <brace-enclosed initializer list>)\xe2\x80\x99\nRun Code Online (Sandbox Code Playgroud)\n有没有大佬有模板推荐一下?
\n对于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)
| 归档时间: |
|
| 查看次数: |
528 次 |
| 最近记录: |