STL容器作为模板参数

moo*_*ose 10 c++ templates stl

我正在尝试将STL容器作为模板参数传递.在这种情况下,矢量.

这是我的无功能代码:

template<template<class> class TContainer, class TObject>
class Foobar
{
public:

    explicit Foobar( TContainer<TObject*> & container )
    :
    container_( container ){}


private:

    TContainer<TObject*> & container_;
};


int _tmain(int argc, _TCHAR* argv[])
{
    std::vector<IUnknown*> v;

    Foobar<std::vector, IUnknown*> bla( v );

    return 0;
}
Run Code Online (Sandbox Code Playgroud)

这是,我正在尝试做什么,因为编译器不能吞下这个?

Jes*_*ood 17

您的代码有几个问题,这是一个工作示例:

template<template<class, class> class TContainer, class TObject>
class Foobar
{
public:
    explicit Foobar( TContainer<TObject*, std::allocator<TObject*>> & container )
    :
    container_( container ){}

private:
    TContainer<TObject*, std::allocator<TObject*>> & container_;
};

int main()
{
    std::vector<IUnknown*> v;
    Foobar<std::vector, IUnknown> bla( v );
}
Run Code Online (Sandbox Code Playgroud)

你的代码的主要错误是它std::vector需要两个模板参数.看起来像这样template<class T, class Allocator = std::allocator<T>> class vector;.此外,Joachim Pileborg关于双指针问题是正确的IUnknown**.但是,您可以使用以下代码简化代码:

template<class TContainer>
class Foobar
{
public:
    explicit Foobar( TContainer & container )
    :
    container_( container ){}

private:
    TContainer & container_; // Be careful with reference members
};

int main()
{
    std::vector<IUnknown*> v;
    Foobar<std::vector<IUnknown*>> bla( v ); // C++11 decltype(v) could be used
}
Run Code Online (Sandbox Code Playgroud)


Pet*_*ker 10

有三种不同的模板参数:值,类型和模板:

template <int value_argument> class C { };
template <class type_argument> class D { };
template <template<classT> class template_argument> class E { };
Run Code Online (Sandbox Code Playgroud)

使用这些模板时,您必须提供正确类型的参数:

C<3> c;
D<int> d;
E<C> e;
Run Code Online (Sandbox Code Playgroud)

使用第三种形式(模板模板参数)时,作为参数传递的模板必须与模板模板参数的声明匹配.在我的简单示例中,模板E需要一个带有一个类型参数的模板模板参数.

在问题的代码中,声明中的第一个参数Foobartemplate <class> class TContainer.在使用它的地方,传递的模板是std::vector:

Foobar<std::vector, IUnknown*> bla(v);
Run Code Online (Sandbox Code Playgroud)

问题是模板模板参数表明它应该有一个参数,但作为实际参数传递的模板有两个或更多.正式,std::vector

template <class T, class Allocator = std::allocator<T>> class vector { ... };
Run Code Online (Sandbox Code Playgroud)

为了使用std::vector> as the first argument toFoobar , the definition ofFoobar`需要更改,以便第一个参数采用两个类型参数:

template <template<class, class> TContainer, class TObject> class Foobar { ... };
Run Code Online (Sandbox Code Playgroud)


cat*_*dle 10

另一种可能性是制作TContainer一个可变参数模板:

#include <vector>

struct TObject {};
struct IUnknown {};

template<template<class...> class TContainer, class TObject>
class Foobar
{
public:
    explicit Foobar( TContainer<TObject*> & container ) : container_( container ){}
private:
    TContainer<TObject*> & container_;
};

int main() {
    std::vector<IUnknown*> v;
    Foobar<std::vector, IUnknown> bla( v );
    return 0;
}
Run Code Online (Sandbox Code Playgroud)