相关疑难解决方法(0)

如何迭代打包的可变参数模板参数列表?

我正在尝试找到一个迭代包变量模板参数列表的方法.现在和所有迭代一样,您需要某种方法来了解打包列表中有多少参数,更重要的是如何从打包参数列表中单独获取数据.

一般的想法是迭代列表,将int类型的所有数据存储到向量中,将char*类型的所有数据存储到向量中,并将float类型的所有数据存储到向量中.在这个过程中,还需要一个单独的向量来存储参数进入顺序的各个字符.例如,当你push_back(a_float)时,你也在做一个push_back('f'),它只是存储一个单独的char来了解数据的顺序.我也可以在这里使用std :: string,只需使用+ =.该矢量仅用作示例.

现在,事物的设计方式是功能本身是使用宏构建的,尽管存在恶意,但它是必需的,因为这是一个实验.因此,使用递归调用几乎是不可能的,因为将包含所有这些的实际实现将在编译时扩展; 你不能招募一个宏.

尽管有各种可能的尝试,我仍然坚持要弄清楚如何实际做到这一点.所以相反,我使用了一个更复杂的方法,包括构造一个类型,并将该类型传递到varadic模板,在一个向量中扩展它,然后简单地迭代它.但是我不想像以下那样调用函数:

foo(arg(1), arg(2.0f), arg("three");
Run Code Online (Sandbox Code Playgroud)

所以真正的问题是如果没有这样的话我该怎么办?为了让你们更好地理解代码实际在做什么,我已经粘贴了我目前正在使用的乐观方法.

struct any {
  void do_i(int   e) { INT    = e; }
  void do_f(float e) { FLOAT  = e; }
  void do_s(char* e) { STRING = e; }

  int   INT;
  float FLOAT;
  char *STRING;
};


template<typename T> struct get        { T      operator()(const any& t) { return T();      } };
template<>           struct get<int>   { int    operator()(const any& t) { return t.INT;    } };
template<>           struct get<float> { float  operator()(const any& …
Run Code Online (Sandbox Code Playgroud)

c++ variadic-templates c++11

50
推荐指数
6
解决办法
4万
查看次数

使用折叠表达式打印所有可变参数,并在其间使用换行符

C++ 17折叠表达式的经典示例是打印所有参数:

template<typename ... Args>
void print(Args ... args)
{
    (cout << ... << args);
}
Run Code Online (Sandbox Code Playgroud)

例:

print("Hello", 12, 234.3, complex<float>{12.3f, 32.8f});
Run Code Online (Sandbox Code Playgroud)

输出:

Hello12234.3(12.3,32.8)
Run Code Online (Sandbox Code Playgroud)

我想在输出中添加换行符.但是,我找不到一个好方法,到目前为止我找到的最好的方法:

template<typename ... Args>
void print(Args ... args)
{
    (cout << ... << ((std::ostringstream{} << args << "\n").str()));
}
Run Code Online (Sandbox Code Playgroud)

然而,这不是零开销,因为它ostringstream为每个参数构造临时值.

以下版本也不起作用:

(cout << ... << " " << args);

error: expression not permitted as operand of fold expression
Run Code Online (Sandbox Code Playgroud)

(cout << ... << (" " << args));

error: invalid operands to binary expression 
Run Code Online (Sandbox Code Playgroud)

我理解为什么最后两个版本不起作用.使用折叠表达式是否有更优雅的解决方案?

c++ variadic-templates fold-expression c++17

10
推荐指数
2
解决办法
1642
查看次数

标签 统计

c++ ×2

variadic-templates ×2

c++11 ×1

c++17 ×1

fold-expression ×1