包含常量类型模板的类的模板?

One*_*Day 3 c++ templates

情况

我正在尝试实现一个包含特定数据类型的容器 - 让我们称之为C.容器(我们称之为B)是A的内部类.我正在尝试声明模板但是遇到了编译问题我不知道该怎么做.

尝试

template <typename T<C>>
class A
{
    class B
    {
    typedef std::unique_ptr<T> containerPtr;
    private:
        containerPtr container;
    }
}

typedef std::shared_ptr<A<std::vector<C>>> somePtr; // Error!
Run Code Online (Sandbox Code Playgroud)

错误是:

结构C

类型名称是不允许的


template <typename T,U>
class A
{
    class B
    {
    typedef std::unique_ptr<T<U>> containerPtr;
    private:
        containerPtr container; // But does it contain C or some other type now? 
        // We have to do a check - what's the best approach?
    }
}

typedef std::shared_ptr<A<std::vector<C>>> somePtr; 
Run Code Online (Sandbox Code Playgroud)

在这种情况下,最好的方法是什么?

tem*_*def 5

如果你知道一个事实T是一个存储某种类型的模板容器C,那么你不需要在C任何地方指定,只能模板化T:

template <typename T>
class A {
    class B {
       /* Use the type name T however you'd like. */
    };
};
Run Code Online (Sandbox Code Playgroud)

这是有效的,因为T必须是完整类型的名称,所以如果你做了类似的事情

A<std::vector<int>>
Run Code Online (Sandbox Code Playgroud)

然后Tstd::vector<int>任何时候你使用T它会具体为std::vectorint不是任何其他类型的S和.

另一方面,如果您希望客户端提供模板类的名称,然后根据您的选择强制实例化它C,则可以使用模板模板参数,如下所示:

template <template <typename...> class T>
class A {
    class B {
        typedef std::unique_ptr<T<C>> containerPtr;
        /* ... use containerPtr ... */
    };
};
Run Code Online (Sandbox Code Playgroud)

这要求用户给你一个模板类型,所以你要写一些类似的东西

A<std::vector> myObject;
Run Code Online (Sandbox Code Playgroud)

然后,您的A模板将std::vector使用该类型进行实例化C.