我想创建一个模板类,它可以容纳容器和容器的任意组合。例如,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;
我是否使用正确的方法来创建这种类?
答案 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作为模板模板参数Container
和Containee
,然后它们可以与任意数量/类型的模板参数一起使用。 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;
}
您可以将非默认分配器与此类容器一起使用,但不能轻松创建具有不同元素类型的类似容器。这可能是也可能不是你的障碍。