我正在尝试找到一个迭代包变量模板参数列表的方法.现在和所有迭代一样,您需要某种方法来了解打包列表中有多少参数,更重要的是如何从打包参数列表中单独获取数据.
一般的想法是迭代列表,将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++ 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) 我有一个这样的功能模板:
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.你能告诉我如何在没有递归的情况下做到这一点吗?