从模板类继承的C++模板类
问题描述:
我尝试使用从另一个模板类继承的部分专用模板类。我不知道如何去。这里是我的代码:从模板类继承的C++模板类
template < typename T>
struct SmallContainer
{
typedef vector<T> type;
};
template<typename CONTAINER, typename T>
class AnotherClass : public CONTAINER<SmallContainer<T>::type>
{ // ..... };
和gcc保持之前 '<' 令牌
预期模板的名称前 '<' 令牌 预期的 '{' 前 '<' 令牌 预期不合格-ID说我的对象的想法是让AnotherClass成为我想要的任何其他类型的向量的通用容器。
我试着做模板<模板CONTAINER,typename T> etc ...没有任何成功。 有什么想法? 谢谢...
答
这将工作只是一个模板参数的容器:
template< template<typename> class Container, typename T >
class AnotherClass
: public Container< typename SmallContainer<T>::type >
{};
然而,这不会为任何标准集装箱的工作,因为他们有额外的模板参数(如分配器)。
请注意,在SmallContainer<T>::type
之前需要typename
,否则编译器会认为它指的是一个值。
答
这不能真正做到,无论如何不是STL容器。您可以为每个容器创建一个类似SmallContainer的包装器,以便您可以提供默认参数,但STL容器大部分不共享通用参数。此外,没有办法匹配任意类型的第三方模板。但是,给定包装器或C++ 11别名,您可以将CONTAINER变为模板模板参数。
请注意,没有任何标准库容器模板会采用单个模板参数,它们具有您通常不会使用的默认设置,因此您通常只提供一个,但迄今为止建议的答案都不适用于标准库模板。
答
让用户指定容器的常用方法是将实际容器类作为模板参数,而不仅仅是容器模板。这也是标准库如何指定容器适配器。例如:
template <typename T, typename Container = std::vector<T>>
class Foo
{
public:
typedef Container container_type;
void multiply_all()
{
using std::begin;
using std::end;
for (auto it(begin(c)), e(end(c)); it != e; ++it)
{
*it = *it + *it;
}
}
private:
container_type c;
};
现在,用户可以创建其他实例一样Foo<int, CrazyContainer<int, true, Blue>> x;
,你永远不必担心它们的容器的细节。
可变模板签名将匹配任何具体签名:'template class Container'。 –
@Kerrek SB:除非它有非类型的模板参数,比如'std :: array'。 –