我有这个模板功能(我记得从SO那里看到类似的东西)。它适用于std::function
和std::list
(Container
)。但我无法理解语法template <typename, typename...> class Container
。 <
>
中的内容似乎是一种不同的语言(与C /旧C ++相比)。有人可以解释一下,或者提供一个很好的参考资料来解释这个问题吗?
template <typename T, template <typename, typename...> class Container>
static bool contained(const T & x, const Container<T> & xs) {
return std::find(xs.begin(),xs.end(),x) != xs.end();
}
答案 0 :(得分:2)
template <typename T, template <typename, typename...> class Container>
以上表明Container
是模板模板参数,这意味着传递给函数模板的Container
类型本身必须是一个至少带有一个模板参数的模板 - 参数包(typename...
)将使用第二个模板参数。
但是你的功能模板有问题。正如我解释的那样,你指出Container
必须是一个带有一个或多个模板参数的类模板,但是相应的函数参数(xs
)表明它需要一个模板参数。这与std::list
或std::vector
或std::deque
一起使用的原因是因为它们各自的第二个模板参数(分配器类型)具有默认值(std::allocator<T>
)。如果它们具有非默认分配器类型,则您的功能模板将无法与其中一个容器一起使用。
要修复它,xs
的类型也需要容纳额外的模板参数。
template <typename T, typename... Params,
template <typename, typename...> class Container>
static bool contained(const T & x, const Container<T, Params...> & xs) {
return std::find(xs.begin(),xs.end(),x) != xs.end();
}
然而,可以在不使用模板模板参数的情况下解决该特定问题。只需接受任何类型Container
,而不是将其作为模板的规定。可以使用标准库中所有容器定义的Container::value_type
嵌套类型来指定要搜索的元素的类型。
template <typename Container>
static bool contained(typename Container::value_type const& x,
const Container& xs) {
return std::find(xs.begin(),xs.end(),x) != xs.end();
}
此外,C ++ 11添加了std::any_of
,其功能与contained()
功能相同。