C++ 模板类,变长参数怎么做
C++ 模板类,变长参数如何做?
碰到个问题,比如我写一个 C++ 模板类:
我想达到的目的是:参数类型、个数不确定,
那么在这个模板类的构造函数中,我如何得知传递进来的参数?
比如,在程序中用
来创建一个实例,怎样才能知道参数的类型和长度?
谢谢大家!
(问题能解决的话,分不够再加)
------解决方案--------------------
参考gcc tuple的实现方法
碰到个问题,比如我写一个 C++ 模板类:
- C/C++ code
template<typename ... TT> class CXXX
我想达到的目的是:参数类型、个数不确定,
那么在这个模板类的构造函数中,我如何得知传递进来的参数?
比如,在程序中用
- C/C++ code
CXXX<RECT, ICONINFO> temp
来创建一个实例,怎样才能知道参数的类型和长度?
谢谢大家!
(问题能解决的话,分不够再加)
------解决方案--------------------
参考gcc tuple的实现方法
- C/C++ code
template<std::size_t _Idx, typename... _Elements> struct _Tuple_impl; template<std::size_t _Idx> struct _Tuple_impl<_Idx> { protected: void _M_swap_impl(_Tuple_impl&) { /* no-op */ } }; template<std::size_t _Idx, typename _Head, typename... _Tail> struct _Tuple_impl<_Idx, _Head, _Tail...> : public _Tuple_impl<_Idx + 1, _Tail...>,
------解决方案--------------------
使用 va_start 和 va_end 宏,例如
- C/C++ code
/* va_start example */ #include <stdio.h> #include <stdarg.h> void PrintFloats ( int amount, ...) { int i; double val; printf ("Floats passed: "); va_list vl; va_start(vl,amount); for (i=0;i<amount;i++) { val=va_arg(vl,double); printf ("\t%.2f",val); } va_end(vl); printf ("\n"); } int main () { PrintFloats (3,3.14159,2.71828,1.41421); return 0; }
------解决方案--------------------
------解决方案--------------------
我在一个模板中见过这种写法,虽然不是任意长度的参数,但是基本上这种方式是比较简单的
- C/C++ code
#define DELEGATE(TYPENAME_TEMPLATE_LIST,ARG_TYPE_LIST,ARG_PARAM_LIST,ARG_TYPE_PARAM_LIST) \ \ template<typename RET TYPENAME_TEMPLATE_LIST> \ class IFunction<RET(ARG_TYPE_LIST)> \ .......................... template<typename RET TYPENAME_TEMPLATE_LIST> \ class MyTest<RET(ARG_TYPE_LIST)> \ .......................... #define TYPENAME_TEMPLATE_LIST_0 #define TYPENAME_TEMPLATE_LIST_1 TYPENAME_TEMPLATE_LIST_0 ,typename TT1 #define TYPENAME_TEMPLATE_LIST_2 TYPENAME_TEMPLATE_LIST_1 ,typename TT2 #define TYPENAME_TEMPLATE_LIST_3 TYPENAME_TEMPLATE_LIST_2 ,typename TT3 #define ARG_TYPE_LIST_0 #define ARG_TYPE_LIST_1 TT1 #define ARG_TYPE_LIST_2 ARG_TYPE_LIST_1 ,TT2 #define ARG_TYPE_LIST_3 ARG_TYPE_LIST_2 ,TT3 #define ARG_PARAM_LIST_0 #define ARG_PARAM_LIST_1 at1 #define ARG_PARAM_LIST_2 ARG_PARAM_LIST_1 ,at2 #define ARG_PARAM_LIST_3 ARG_PARAM_LIST_2 ,at3 #define ARG_TYPE_PARAM_LIST_0 #define ARG_TYPE_PARAM_LIST_1 TT1 at1 #define ARG_TYPE_PARAM_LIST_2 ARG_TYPE_PARAM_LIST_1 ,TT2 at2 #define ARG_TYPE_PARAM_LIST_3 ARG_TYPE_PARAM_LIST_2 ,TT3 at3 DELEGATE(TYPENAME_TEMPLATE_LIST_0,ARG_TYPE_LIST_0,ARG_PARAM_LIST_0,ARG_TYPE_PARAM_LIST_0) DELEGATE(TYPENAME_TEMPLATE_LIST_1,ARG_TYPE_LIST_1,ARG_PARAM_LIST_1,ARG_TYPE_PARAM_LIST_1) DELEGATE(TYPENAME_TEMPLATE_LIST_2,ARG_TYPE_LIST_2,ARG_PARAM_LIST_2,ARG_TYPE_PARAM_LIST_2) DELEGATE(TYPENAME_TEMPLATE_LIST_3,ARG_TYPE_LIST_3,ARG_PARAM_LIST_3,ARG_TYPE_PARAM_LIST_3) #undef TYPENAME_TEMPLATE_LIST_0 #undef TYPENAME_TEMPLATE_LIST_1 #undef TYPENAME_TEMPLATE_LIST_2 #undef TYPENAME_TEMPLATE_LIST_3 #undef ARG_TYPE_LIST_0 #undef ARG_TYPE_LIST_1 #undef ARG_TYPE_LIST_2 #undef ARG_TYPE_LIST_3 #undef ARG_PARAM_LIST_0 #undef ARG_PARAM_LIST_1 #undef ARG_PARAM_LIST_2 #undef ARG_PARAM_LIST_3 #undef ARG_TYPE_PARAM_LIST_0 #undef ARG_TYPE_PARAM_LIST_1 #undef ARG_TYPE_PARAM_LIST_2 #undef ARG_TYPE_PARAM_LIST_3