【问题标题】:variadic template template parameter syntax可变参数模板模板参数语法
【发布时间】:2014-07-11 20:39:20
【问题描述】:

我有这个模板功能(我记得在某处看到过类似的东西)。它适用于std::functionstd::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();
}

【问题讨论】:

  • 您可能会发现这个细微的修改很有趣(see here)。请注意,这不会与链接 libc++ 的 clang3.4 一起编译(但可以链接 libstdc++)。不同之处在于std::list 的实现方式。添加可变参数包解决了这个问题,与第一个相比的输出值得研究(see here)
  • 确实如此。很高兴知道。

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


【解决方案1】:
template <typename T, template <typename, typename...> class Container>

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

但是你的函数模板有问题。正如我所解释的,您指出 Container 必须是一个接受一个或多个模板参数的类模板,但相应的函数参数 (xs) 表示它接受一个模板参数。这适用于std::liststd::vectorstd::deque 的原因是因为它们各自的第二个模板参数,分配器类型,具有默认值(std::allocator&lt;T&gt;)。如果它们具有非默认分配器类型,则您的函数模板将无法与这些容器之一一起使用。

要修复它,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() 函数相同。

【讨论】:

    猜你喜欢
    • 2016-12-01
    • 2012-11-05
    • 1970-01-01
    • 1970-01-01
    • 2012-03-28
    • 1970-01-01
    • 1970-01-01
    • 2013-09-14
    • 2014-09-08
    相关资源
    最近更新 更多