我发现以下代码使用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);
}
请问您是否遵循标准来指定模板模板参数而不列出参数类型(上例中的容器元素类型和分配器类型)?
答案 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;