您的位置:首页 > 编程语言 > C语言/C++

c++模板实现多参数任意传 - 类实现

2015-11-29 14:32 477 查看
之前写的有篇文章是用方法实现的变长参数,这边就是用类实现的,更加高大上,这样就可以对不同的实例对象进行处理。

下面是《深入理解c++11》书中的截图





下面是自己实现的代码

//--------------------- 实现模板的递归 begin ------------------
template < typename... Args>
class MultiArgs; //变长模板声明,一定要最上面,不然编译报错

template <>
class MultiArgs<> {}; //边界条件,终止继承递归

template < typename T, typename... Args>
class MultiArgs<T, Args...> : public MultiArgs<Args...> //偏特化递归定义
{
public:
MultiArgs(T _t, Args... _args) : MultiArgs<Args...>(_args...)
{
value = _t;
std::cout << "--- addr:0x" << this << ", value:" << _t << std::endl;
//TODO:这里可以实现处理参数_t的逻辑,
//比如丢重载各种匹配参数的函数,到自定义数据结构的容器中
}
public:
T value;
};
//--------------------- 实现模板的递归 begin ------------------

template <typename... Args>
void sendMsg(Args... _args)
{
//计算变长报的长度:sizeof...(Args)
int argsLength = sizeof...(Args);
std::cout << "--- _args length:" << argsLength << std::endl; //多参数使用时一定要带上...
MultiArgs<Args...> ma(_args...);
}

void testArgsForClass()
{
sendMsg(111, "yang", 22.22f, true);
}
/*
结果:
--- _args length:4
--- addr:0x0016F72C, value:1
--- addr:0x0016F72C, value:22.22
--- addr:0x0016F72C, value:yang
--- addr:0x0016F72C, value:111
类的初始化顺序是先初始化构造函数:后面的东西,再初始化{}块里的东西,
所以打印的顺序是传入sendMsg参数时的顺序反过来
*/
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: