一个可变参数模板作为模板参数,没有包扩展

时间:2017-02-19 14:39:06

标签: c++14 variadic-templates

我发现以下代码使用VS 2015编译并成功运行:

template<typename T, template <typename ...> class Container >
struct Holder
{
    Container<T> container_;
};

int main()
{
    Holder<int, std::vector> h;
    h.container_.push_back(10);
    std::cout << h.container_.at(0);
}

请问您是否遵循标准来指定模板模板参数而不列出参数类型(上例中的容器元素类型和分配器类型)?

1 个答案:

答案 0 :(得分:1)

  

我想知道它是否允许以这种方式使用可变参数模板(或者它是某些MS C ++非标准功能)

根据standard(工作草案,但同样适用于C ++ 11 / C ++ 14),它是完全有效的代码。该标准还包含一些使用示例,如下所示:

template <class T> struct eval;

template <template <class, class...> class TT, class T1, class... Rest>
struct eval<TT<T1, Rest...>> { };

您需要一个容器参数包,因为标准模板库中定义的几个参数包接受多个参数(即使几乎所有这些参数都有默认值)。
例如,您的代码中使用的容器声明为:

template<class T, class Allocator = std::allocator<T>> class vector;

因此,以下内容不会匹配:

template<typename T, template <typename> class Container> struct Holder;