tuple的疑问

fztfztfzt 2014-12-04 10:39:34
#include<tuple>
#include<iostream>
#include<string>
using namespace std;
template<int IDX,int MAX,typename... Args>
struct PRINT_TUPLE
{
static void print(ostream& strm, const tuple<Args...> &p)
{
strm << get<IDX>(p) << (IDX + 1 == MAX ? "" : ",");
if(IDX+1 != MAX) PRINT_TUPLE<IDX+1, MAX, Args...>::print(strm, p);
}
};
template<int MAX,typename... Args>//为什么这段不能注释掉?已经不会调用了
struct PRINT_TUPLE<MAX, MA`X, Args...>
{
static void print(ostream& strm, const tuple<Args...> &p)
{
cout << "last";
}
};
template<typename... Args>
ostream& operator << (ostream &strm, const tuple<Args...> &p){
cout << "[";
PRINT_TUPLE<0, sizeof...(Args), Args...>::print(strm, p);
return cout << "]";
}

int main()
{
tuple<int, float, string > p(12, 1.2, "asdasd");
cout << p;
getchar();
}
...全文
153 7 打赏 收藏 转发到动态 举报
写回复
用AI写文章
7 条回复
切换为时间正序
请发表友善的回复…
发表回复
fly_dragon_fly 2014-12-05
  • 打赏
  • 举报
回复
if(IDX+1 != MAX) PRINT_TUPLE<IDX+1, MAX, Args...>::print(strm, p);
当IDX+1==MAX时,运行时不调用,但编译器需要知道原型,如果不提供,就递归自己了,跟下面代码一样
if(0) test();
这个函数不被调用,但必须提供原型
fztfztfzt 2014-12-05
  • 打赏
  • 举报
回复
引用 1 楼 unituniverse2 的回复:
那个是作为实例化递归终止条件的特化。 这是编译期分析,和函数是否真的在运行期间被调用到是两回事(注意编译器是不执行非constexpr函数代码的,根本不会知道上面的if后面的条件在程序运行的时候会不会执行到)。 需不需要那个特化和运行时候的具体行为无关,只和编译期间是否需要生成对应的代码(实例化)有关。 其实这可以当成是否真的了解编译时运行时概念的好例子。
那么编译时为什么要生成那段代码,为什么要生成一段无意义的代码?
unituniverse2 2014-12-05
  • 打赏
  • 举报
回复
那个是作为实例化递归终止条件的特化。 这是编译期分析,和函数是否真的在运行期间被调用到是两回事(注意编译器是不执行非constexpr函数代码的,根本不会知道上面的if后面的条件在程序运行的时候会不会执行到)。 需不需要那个特化和运行时候的具体行为无关,只和编译期间是否需要生成对应的代码(实例化)有关。 其实这可以当成是否真的了解编译时运行时概念的好例子。
unituniverse2 2014-12-05
  • 打赏
  • 举报
回复
实际上编译器关心的只是怎么安排代码,而不会管执行时候的问题了 比如你的例子,编译器关心的是“如果需要用到这个函数,我到哪里找它的实现代码”而不是“到时候会不会执行到” 程序运行时早已没编译器什么事了
unituniverse2 2014-12-05
  • 打赏
  • 举报
回复
引用 4 楼 fztfztfzt 的回复:
[quote=引用 1 楼 unituniverse2 的回复:] 那个是作为实例化递归终止条件的特化。 这是编译期分析,和函数是否真的在运行期间被调用到是两回事(注意编译器是不执行非constexpr函数代码的,根本不会知道上面的if后面的条件在程序运行的时候会不会执行到)。 需不需要那个特化和运行时候的具体行为无关,只和编译期间是否需要生成对应的代码(实例化)有关。 其实这可以当成是否真的了解编译时运行时概念的好例子。
那么编译时为什么要生成那段代码,为什么要生成一段无意义的代码?[/quote] 这怎么会“无意义”?编译期又不知道到运行期的时候会不会执行到,编译器还以为可能真的会调用到呢
zhousitiaoda 2014-12-05
  • 打赏
  • 举报
回复
学习下。。。。
ri_aje 2014-12-05
  • 打赏
  • 举报
回复
递归的终止条件。其实这样写更干净明确些。

#include<tuple>
#include<iostream>
#include<string>
using namespace std;
template<int IDX,int MAX,typename... Args>
struct PRINT_TUPLE
{
    static void print(ostream& strm, const tuple<Args...> &p)
    {
        strm << get<IDX>(p) << (IDX + 1 == MAX ? "" : ",");
        PRINT_TUPLE<IDX+1, MAX, Args...>::print(strm, p);
    }
};
template<int MAX,typename... Args>//为什么这段不能注释掉?已经不会调用了
struct PRINT_TUPLE<MAX, MAX, Args...>
{
    static void print(ostream&, const tuple<Args...>&)    {    }
};

64,685

社区成员

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

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