使用模板模板参数的替代方法

时间:2013-11-19 15:29:45

标签: c++ templates

我目前使用的模板类有多个参数,

template<class A, class B> class M{ };

但是,在类A的位置,我想插入一个类似

的模板类
template<class C> class A{ };

我发现这样做的唯一解决方案是使用模板模板参数:

template< template<class C> class A, class B> class M{ };

在我的实现中,我使用的A的唯一参数化是A<B>。我不需要使用不同参数的A的多个实例化,例如,我不需要在A<int>中实例化A<double> A<long double>M

是否有替代模板模板参数?我问的原因是对thread的跟进,在他的回答中@Evan Teran说他只有一次必须使用模板模板参数......

我想我的问题就是:使用模板模板参数有缺点吗?

2 个答案:

答案 0 :(得分:2)

假设B可以从A<B>以某种方式确定,您可以只使用一个模板参数:

template <class A> class M
{
  typedef typename A::The_B_Type B;
};

当然,The_B_Type必须是A<B>中的有效typedef。这是标准库容器提供所有typedef的原因之一。例如,如果模板Astd::vector,则可以执行此操作:

template <class A> class M
{
  typedef typename A::value_type B;
};

答案 1 :(得分:1)

您可以将实例化的A<B>作为参数,然后使用traits类在需要时提取传递给B的{​​{1}}:

A<B>

traits类命名不佳,但您可以看到我可以从template<typename T> struct extract_b {}; // SFINAE enabled template<template<class>class A, typename B> struct extract_b< A<B> > { typedef B type; }; // C++11, you can replace it with typename extract_b<T>::type at point of use // if you lack support for it: template <typename T> using ExtractB = typename extract_b<T>::type; template<typename A> struct M { typedef ExtractB<A> B; // ... }; 中获取template参数并在A<B>中公开。