可变参数模板模板参数语法

时间:2014-07-05 03:59:54

标签: c++ templates c++11 variadic-templates

我有这个模板功能(我记得从SO那里看到类似的东西)。它适用于std::functionstd::listContainer)。但我无法理解语法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();
}

1 个答案:

答案 0 :(得分:2)

template <typename T, template <typename, typename...> class Container>

以上表明Container是模板模板参数,这意味着传递给函数模板的Container类型本身必须是一个至少带有一个模板参数的模板 - 参数包(typename...)将使用第二个模板参数。

但是你的功能模板有问题。正如我解释的那样,你指出Container必须是一个带有一个或多个模板参数的类模板,但是相应的函数参数(xs)表明它需要一个模板参数。这与std::liststd::vectorstd::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()功能相同。