C++ varadic模板混合了值、数组和对象。

我想初始化一个包含基本类型、数组和子结构的类,如

A a { 1,                   // int
      1.2,                 // double
      "Hello",             // const char *
      { 1, 2, 3 },         // array<int>
      { 1.2, 2.4 }         // array<double>
      { 1, 1.2, "Hello" }  // sub-structure of any types
};

其中子结构也应该能够包含嵌套的子结构。

对于基本类型,我可以用变型模板来实现。

#include <iostream>

class A {
public:

   template <class T, class... Args>
   void print(T v) {
      std::cout << v << std::endl;
   }

   template <class T, class... Args>
   void print(T v, Args... args) {
      std::cout << v << std::endl;
      print(args...);
   };

   template <class T, class... Args>
   A(T v, Args... args) {
      print(v, args...);
   };
};

int main() {

   A a { 1,
         1.2,
         "Hello",
   };
}

它可以正确地产生

1
1.2
Hello

但我对数组和子结构失败。我仅限于C++11.任何帮助非常感激。

解决方案:

{/*..*/} 没有类型,所以不能在模板中推导出除了 std::initializer_list<T> 阵列 T(&)[N].

所以对于变型模板,由于你不能提供所有这些组合的重载,你必须提供type,由于你使用的是模板构造函数,只能在type本身。

A a { 1,                   // int
      1.2,                 // double
      "Hello",             // const char *
      std::array<int, 3>{1, 2, 3 },         // array<int>
      std::array<double, 2>{ 1.2, 2.4 }     // array<double>
      MyClass{ 1, 1.2, "Hello" }  // sub-structure of any types
};

C++17,用CTAD,允许 std::array{1, 2, 3} 而不是 std::array<int, 3>{1, 2, 3}.

给TA打赏
共{{data.count}}人
人已打赏
未分类

当我使用解析时,未处理的承诺拒绝错误。

2022-9-8 22:55:24

未分类

Spring testcontainers Driver org.testcontainers.jdbc.ContainerDatabaseDriver声称不接受jdbcUrl。

2022-9-8 22:55:26

0 条回复 A文章作者 M管理员
    暂无讨论,说说你的看法吧
个人中心
购物车
优惠劵
今日签到
有新私信 私信列表
搜索