相关疑难解决方法(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++ 14 make_integer_sequence

我尝试实现C++ 14别名模板make_integer_sequence,这简化了类模板的创建integer_sequence.

template< class T, T... I> struct integer_sequence
{
    typedef T value_type;
    static constexpr size_t size() noexcept { return sizeof...(I) ; }

};

template< class T, T N>
using make_integer_sequence = integer_sequence< T, 0,1,2, ... ,N-1 >; // only for illustration.
Run Code Online (Sandbox Code Playgroud)

为了实现,make_integer_sequence我们需要一个辅助结构make_helper.

template< class T , class N >
using make_integer_sequence = typename make_helper<T,N>::type;
Run Code Online (Sandbox Code Playgroud)

实施make_helper并不太难.

template< class T, T N, T... I >
struct make_helper
{
   typedef …
Run Code Online (Sandbox Code Playgroud)

c++ gcc c++11 c++14

47
推荐指数
3
解决办法
2万
查看次数

迭代可变参数模板的类型参数

我有一个这样的功能模板:

template <class ...A>
do_something()
{
  // i'd like to do something to each A::var, where var has static storage
}
Run Code Online (Sandbox Code Playgroud)

我不能用Boost.MPL.你能告诉我如何在没有递归的情况下做到这一点吗?

c++ templates variadic-templates c++11

18
推荐指数
2
解决办法
1万
查看次数

标签 统计

c++ ×3

c++11 ×3

variadic-templates ×2

c++14 ×1

gcc ×1

templates ×1