tcy23456 2020-11-27 20:16 采纳率: 33.3%
浏览 214
已结题

C++预编译时如何判断数据类型?

你好:
我想写个pair的打印输出,采用模板形式,我怎么在预处理时判断数据类型?比如是string s我输出cout<<s.c_str();是struct A{const char *name;int age;}; A a{"Tom",22} 输出cout<<a.name<<a.age等。

我写了一个还有问题,请问怎么解决?
template<typename T1, typename T2>
void print_pair(const pair<T1,T2> &p) { 
    cout << "(";
#if (T1 == string)
        cout << p.first.c_str() << ",";
#else
cout << p.first << ",";
#endif
    cout<< p.second <<")"<< endl; }

pair<string,int> s("Tom",22);//能正常输出

struct struType{const char *name;int age;}; 
struType a{"Tom",22};
pair<struType,int>s1(a,22);

这个该怎么输出?

  • 写回答

3条回答 默认 最新

  • include_iostream_ 2020-11-28 19:28
    关注

    预编译期根本就不考虑类型,所以预处理期做这件事是不可能的。要做到不同类型编译不同分支,可以使用if constexpr,编译器会在编译期就处理这类if语句,而不会占用运行时资源。

    您的程序没有定义ostream& operator<<(ostream&, const struType&)的行为,这样的话也是没办法进行cout的。我进行了一点改动:

    #include <iostream>
    #include <fstream>
    #include <cstdio>
    #include <cstdlib>
    #include <cmath>
    #include <algorithm>
    #include <string>
    using namespace std;
    
    struct SomeStruct {
    	const char *name;
    	int age;
    };
    
    ostream& operator<<(ostream& os, const SomeStruct& x) {
    	os << x.name << ' ' << x.age;
    	return os;
    }
    
    template<typename T1, typename T2>
    void print_pair(const pair<T1,T2> &p) { 
        cout << "(";
        if constexpr (is_same_v<T1, string>) cout << p.first.c_str() << ",";
        else cout << p.first << ",";
        cout<< p.second <<")"<< endl;
    }
    
    SomeStruct a {"Tom", 22};
    pair<SomeStruct, int> s1(a, 22);
    
    int main() {
    	pair<string,int> s("Tom",22);
    	print_pair(s);
    	print_pair(s1);
    	return 0;
    }
    
    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论
查看更多回答(2条)

报告相同问题?

问题事件

  • 系统已结题 11月30日
  • 已采纳回答 11月22日

悬赏问题

  • ¥50 comfyui下连接animatediff节点生成视频质量非常差的原因
  • ¥20 有关区间dp的问题求解
  • ¥15 多电路系统共用电源的串扰问题
  • ¥15 slam rangenet++配置
  • ¥15 有没有研究水声通信方面的帮我改俩matlab代码
  • ¥15 对于相关问题的求解与代码
  • ¥15 ubuntu子系统密码忘记
  • ¥15 信号傅里叶变换在matlab上遇到的小问题请求帮助
  • ¥15 保护模式-系统加载-段寄存器
  • ¥15 电脑桌面设定一个区域禁止鼠标操作