如何具有类型和大小的可变参数模板?

塞拉纳尔莫

只是为了好玩我试图重载a struct,astd::array<T,SIZE>为a std::vector<T>,a为a和a std::unordered_map<T,U>所以我做了以下事情:

  template<typename... T>
  struct Cont; 

  template<typename T, std::size_t SIZE>
  struct Cont<T,SIZE>
  {
    Cont(std::string n) : name(n){}

    std::string name;
    std::array<T,SIZE> array;
  };

  template<typename T>
  struct Cont<T>
  {
    Cont(std::string n) : name(n){}

    std::string name;
    std::vector<T> vector;
  };

  template<typename T, typename U>
  struct Cont<T,U>
  {
    Cont(std::string n) : name(n){}

    std::string name;
    std::unordered_map<T,U> unordered_map;
  };

但是,当我尝试编译它时,出现了错误expected a type, got SIZE我完全理解是因为typename... T期望类型而不是std::size_t所以我尝试了:

template<std::size_t SIZE, typename... T>
struct Cont;

template<typename... T>
struct Cont;

这也是行不通的,因为然后我重新定义并且没有像我本来以为的那样过载。我也意识到,我可以做到:

template<std::size_t SIZE, typename... T>
struct Cont;

但是,我在声明它们时希望在某种意义上尽可能保持整洁:

int main()
{
  Cont<int,5> myArray("myArray");
  myArray.array = {1,2,3,4,5};

  Cont<int> myVector("myVector");
  myVector.vector = {1,2,3,4};

  Cont<int,int> myMap("myMap");
  myMap.unordered_map[0] = 2;
}

有没有办法使模板超载?(我假设这不是),或以说我是typename... T的方式构建模板typename T, std::size_t SIZE

弗朗索瓦·安德里厄

我不确定如何获得您想要的东西。也许更聪明的用户可以找到确切的解决方案。但是一种替代方法可能是只为模板使用类型参数包,而std::integral_constant对数字模板参数使用s。然后,您可以专门针对每种情况。例如 :

#include <array>
#include <type_traits>
#include <unordered_map>
#include <vector>

template<class...>
struct Cont;

template<class T, class U, U S>
struct Cont<T, std::integral_constant<U, S>>
{
    Cont(const char *) {};
    std::array<T, S> array;
};

template<class T>
struct Cont<T>
{
    Cont(const char *) {};
    std::vector<T> vector;
};

template<class T>
struct Cont<T, T>
{
    Cont(const char *) {};
    std::unordered_map<T, T> unordered_map;
};

int main()
{
  Cont<int,std::integral_constant<int, 5>> myArray("myArray");
  myArray.array = {1,2,3,4,5};

  Cont<int> myVector("myVector");
  myVector.vector = {1,2,3,4};

  Cont<int,int> myMap("myMap");
  myMap.unordered_map[0] = 2;
}

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章

具有可变参数模板参数的函数指针

具有可变参数模板和变量捕获的C ++ 11“重载lambda”

可变参数模板,类型扣除和std :: function

可变参数模板-如何创建类型,存储传递的参数

具有相同参数类型的可变参数模板函数

具有依赖类型的c ++ 11可变参数函数模板是否不明确?

具有左值和右值的可变参数模板类构造函数

具有模板函数名称的可变参数模板

具有可变参数模板的成员函数指针

具有双打的C ++可变参数模板

具有const引用的可变参数模板

具有递归继承并使用声明的可变参数模板

类型名称和标量常量的可变参数模板

std :: bind与可变参数模板和自动返回类型

非类型可变参数模板参数

可变参数模板函数参数和引用类型推导

具有相同大小的两个可变参数模板参数

具有混合类型参数和非类型可变参数的模板模板参数

C ++创建具有可变参数模板方法的接口

如何创建具有可变数量的类型参数的模板?

具有相同类型的可变参数模板参数的构造函数无法编译

具有变化的返回类型的可变参数模板参数列表

C ++:如何在可变参数模板参数上调用带有类型参数的函数?

具有相同类型参数的可变参数模板化函数

具有元组的C ++可变参数模板

如何检查所有可变参数模板参数是否都具有特殊功能?

是否可以构建具有不同类型的可变参数模板?

如何迭代可变参数模板类型(不是参数)?

从具有可变参数模板构造函数的类型构造 std::function 对象