模板定义与模板模板参数的类,可以专门化,例如,std :: vector <std :: string>或std :: map <std :: tree>

时间:2017-08-22 07:25:31

标签: c++ templates vector stl

我想创建一个模板类,它可以容纳容器和容器的任意组合。例如,std::vector<std::string>std::map<std::tree>,例如。

我尝试了很多组合,但我必须承认模板的复杂性让我感到压力。我编译的关闭是这样的:

template <class Vector, template <typename, class Containee = std::string> class Container>
class GenericContainer
{
    Container<Containee> mLemario;
};

虽然它编译到目前为止,然后,当我想要实例化它时,我会遇到很多错误。

MyContainer<std::vector, std::string> myContainer;

我是否使用正确的方法来创建这种类?

3 个答案:

答案 0 :(得分:8)

std::vector(等)@ songyuanyao提供了一个很好的答案。但由于您还提到了std::map,我还会添加@ songyuanyao答案的简单扩展名online

#include <iostream>
#include <vector>
#include <string>
#include <map>

template <template <typename...> class Container, typename Containee = std::string, typename... extras>
class GenericContainer
{
    Container<Containee, extras ...> mLemario;
    // Use 'Containee' here (if needed) like sizeof(Containee) 
    // or have another member variable like: Containee& my_ref.
};

int main()
{
    GenericContainer<std::vector, std::string> myContainer1;
    GenericContainer<std::vector, std::string, std::allocator<std::string>> myContainer2; // Explicitly using std::allocator<std::string>
    GenericContainer<std::map, std::string, int> myContainer3; // Map: Key = std::string, Value = int
}

答案 1 :(得分:4)

  

我想创建一个模板类,它可以容纳容器和容器的任意组合

您应该使用parameter pack作为模板模板参数ContainerContainee,然后它们可以与任意数量/类型的模板参数一起使用。 e.g。

template <template <typename...> class Container, typename... Containee>
class GenericContainer
{
    Container<Containee...> mLemario;
};

然后

GenericContainer<std::vector, std::string> myContainer1;
GenericContainer<std::map, std::string, int> myContainer2;

答案 2 :(得分:1)

标准容器为其元素类型声明名称,因此您可以编写

template<typename Container>
class GenericContainer
{
    using Containee = typename Container::value_type;
};

你可以像这样使用它:

int main()
{
    GenericContainer<std::vector<std::string>> myContainer;
}

您可以将非默认分配器与此类容器一起使用,但不能轻松创建具有不同元素类型的类似容器。这可能是也可能不是你的障碍。