可变参数模板的问题

hanyuwei0 2014-07-03 08:49:46

template <class T>
void printarg(T t)
{
cout << t << endl;
}

template <class ...Args>
void expand(Args ... args)
{
cout<<args<<endl;
}

int _tmain(int argc, _TCHAR* argv[])
{
printarg(3); //OK
expand(4); //error

return 0;
}

想问下为什么下面那个编译失败呢,我用的是vs2012。是代码不对还是编译器不支持
...全文
267 10 打赏 收藏 转发到动态 举报
写回复
用AI写文章
10 条回复
切换为时间正序
请发表友善的回复…
发表回复
unituniverse2 2014-07-05
  • 打赏
  • 举报
回复
欧阳春晖 2014-07-05
  • 打赏
  • 举报
回复
引用 4 楼 menzi11 的回复:
首先是vs2012不支持可变参数模板,其次你代码也有一定的问题: args要加"..." ,比如: cout<<args...<<endl;但即使是这样也是不对的,因为模板还没聪明到 自动把"..."变成 cout<<args1<<args2<<args3<<endl. 想实现这个功能,只能使用模板元的理念:


template <typename Arg1,typename... Args>
void expand(Arg1 arg1,Args... args)
{
	cout << arg1;
	expand(args...);
}

template <typename Arg1>
void expand(Arg1 arg1)  
{
	cout << arg1 << endl;
}

int main()
{
        expand(1); 
        expand(1,2,3); 
	expand(1,2,3,4,5,6,7,8,9,10,"fuck vs2012",1.0f,1.0,"and fuck vs2013"); 
	return 0;
}

是因为变长模版必须展开,并且展开是有一定的条件的,所以要做个手脚
欧阳春晖 2014-07-05
  • 打赏
  • 举报
回复
引用 8 楼 jack960330 的回复:

template <class ...Args>
void expand(Args ... args)
{
    cout<<args<<endl;
}
楼主,这里是非法的,可变参数必须拆解,并且拆解是有条件的,以下是拆解条件 1、构造函数初始化列表中 2、基类描述符列表 3、C++11统一列表初始化 4、模版参数表 5、函数参数表 6、lambda表达式捕获列表 由此可见你的写法是错误的 楼主可以这么写:

template <typename... T>
void Shell(T... t)
{
   return;
}

template<typename T>
T print(T t)
{
cout<<args<<endl;
return args;
} 

template <typename ...Args>
void  print(Args ... args)
{
   Shell(print(args)...);
}

抱歉,修正以下我写的

template <typename... T>
void Shell(T... t)
{
   return;
}

template<typename T>
T print(T t)
{
cout<<t<<endl;
return t;
} 

template <typename ...Args>
void  print(Args ... args)
{
   Shell(print(args)...);
}

欧阳春晖 2014-07-05
  • 打赏
  • 举报
回复

template <class ...Args>
void expand(Args ... args)
{
cout<<args<<endl;
}

楼主,这里是非法的,可变参数必须拆解,并且拆解是有条件的,以下是拆解条件
1、构造函数初始化列表中
2、基类描述符列表
3、C++11统一列表初始化
4、模版参数表
5、函数参数表
6、lambda表达式捕获列表
由此可见你的写法是错误的
楼主可以这么写:

template <typename... T>
void Shell(T... t)
{
return;
}

template<typename T>
T print(T t)
{
cout<<args<<endl;
return args;
}

template <typename ...Args>
void print(Args ... args)
{
Shell(print(args)...);
}

mujiok2003 2014-07-05
  • 打赏
  • 举报
回复
一般是这么用的
#include <iostream>
#include <utility>
using namespace std;



void print()  
{

}

template <typename Arg1>
void print(Arg1&& arg1)
{
	std::cout << arg1 << std::endl;
}
//多于1个参数,形式上要递归(其实不是递归)
template <typename Arg1,typename... Args>
void print(Arg1&& arg1,Args&&...args)
{
	std::cout << arg1 << ",";
	print(std::forward<Args>(args)...);
}

int main()
{
    print();
    print(67.8);
    print("hello", 5, std::string("go go go")); 
    return 0;
}
zyjj_99 2014-07-04
  • 打赏
  • 举报
回复
引用 4 楼 menzi11 的回复:
首先是vs2012不支持可变参数模板,其次你代码也有一定的问题: args要加"..." ,比如: cout<<args...<<endl;但即使是这样也是不对的,因为模板还没聪明到 自动把"..."变成 cout<<args1<<args2<<args3<<endl. 想实现这个功能,只能使用模板元的理念:


template <typename Arg1,typename... Args>
void expand(Arg1 arg1,Args... args)
{
	cout << arg1;
	expand(args...);
}

template <typename Arg1>
void expand(Arg1 arg1)  
{
	cout << arg1 << endl;
}

int main()
{
        expand(1); 
        expand(1,2,3); 
	expand(1,2,3,4,5,6,7,8,9,10,"fuck vs2012",1.0f,1.0,"and fuck vs2013"); 
	return 0;
}

多么醒目的 fuck vs2012
menzi11 2014-07-04
  • 打赏
  • 举报
回复
首先是vs2012不支持可变参数模板,其次你代码也有一定的问题: args要加"..." ,比如: cout<<args...<<endl;但即使是这样也是不对的,因为模板还没聪明到 自动把"..."变成 cout<<args1<<args2<<args3<<endl. 想实现这个功能,只能使用模板元的理念:


template <typename Arg1,typename... Args>
void expand(Arg1 arg1,Args... args)
{
	cout << arg1;
	expand(args...);
}

template <typename Arg1>
void expand(Arg1 arg1)  
{
	cout << arg1 << endl;
}

int main()
{
        expand(1); 
        expand(1,2,3); 
	expand(1,2,3,4,5,6,7,8,9,10,"fuck vs2012",1.0f,1.0,"and fuck vs2013"); 
	return 0;
}

taodm 2014-07-03
  • 打赏
  • 举报
回复
不是。具体请自己google c++之父亲自写的C++0x faq 中文版。
hanyuwei0 2014-07-03
  • 打赏
  • 举报
回复
引用 1 楼 taodm 的回复:
换VS2013或者gcc4.8以上再试。
那看来是编译器太老了,请问我如果用expand(1,2,3,4); 的话,想在void expand(Args ... args) 里访问单个参数是这样么: args[0],args[1].....
taodm 2014-07-03
  • 打赏
  • 举报
回复
换VS2013或者gcc4.8以上再试。

65,210

社区成员

发帖
与我相关
我的任务
社区描述
C++ 语言相关问题讨论,技术干货分享,前沿动态等
c++ 技术论坛(原bbs)
社区管理员
  • C++ 语言社区
  • encoderlee
  • paschen
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
  1. 请不要发布与C++技术无关的贴子
  2. 请不要发布与技术无关的招聘、广告的帖子
  3. 请尽可能的描述清楚你的问题,如果涉及到代码请尽可能的格式化一下

试试用AI创作助手写篇文章吧