用宏实现模板功能

前言

今天遇到一道作业, 让我想了很久. 这道题真奇葩, 已经被老师玩哭了^_^

我作出来一个结果, 不知道合不合老师的心意~~

题目

4.用宏实现模板功能,分别输出
void main()
{
ADD(int)(1,2);
ADD(float)(1.0f,2.2f);
ADD(int)(10,20);
ADD(char*)("hello","wolrd");
}
 

测试工程

/// @file exam_x_x.cpp
/// @brief 
/**
4.用宏实现模板功能,分别输出
void main()
{
ADD(int)(1,2);
ADD(float)(1.0f,2.2f);
ADD(int)(10,20);
ADD(char*)("hello","wolrd");
}
*/

#include <iostream>
#include <limits>
#include "MicroTemplate.h"

using namespace std;

void clear_cin();

void main()
{
    ADD(int)(1,2);
    ADD(float)(1.0f,2.2f);
    ADD(int)(10,20);
    ADD(char*)("hello","wolrd");

    /** run result
    ADD(int)(1,2) = 3
    ADD(float)(1.0f,2.2f) = 3.2f
    ADD(int)(10,20) = 30
    ADD(char*)("hello","wolrd") = hellowolrd
    */
}

void clear_cin()
{
    cin.clear();
    cin.sync();
}

MicroTemplate.h

// MicroTemplate.h: interface for the MicroTemplate class.
//
//

#if !defined(AFX_MICROTEMPLATE_H__D9D78E4F_0EE0_4768_9BA0_4C872F462072__INCLUDED_)
#define AFX_MICROTEMPLATE_H__D9D78E4F_0EE0_4768_9BA0_4C872F462072__INCLUDED_

#if _MSC_VER > 1000
#pragma once
#endif // _MSC_VER > 1000

#define ADD(x) fnAddAndPrint

inline int fnAddAndPrint(int x, int y)
{
    int Rc = x + y;
    printf("ADD(int)(%d,%d) = %d\r\n", x, y, Rc);

    return Rc;
}

inline float fnAddAndPrint(float x, float y)
{
    float Rc = x + y;
    printf("ADD(float)(%.1ff,%.1ff) = %.1ff\r\n", x, y, Rc);

    return Rc;
}

inline char* fnAddAndPrint(char* x, char* y)
{
    static char s_szBuf[4096] = {'\0'};

    if (NULL != x)
    {
        strcpy(s_szBuf, x);
    }

    if (NULL != y)
    {
        strcat(s_szBuf, y);
    }

    printf("ADD(char*)(\"%s\",\"%s\") = %s\n", x, y, s_szBuf);

    return s_szBuf;
}

#endif // !defined(AFX_MICROTEMPLATE_H__D9D78E4F_0EE0_4768_9BA0_4C872F462072__INCLUDED_)

补充 - 2022_1021_2235

今天CSDN同学给了一个优质实现, 感谢!

// 这是 qq_45279840@csdn 提供的一个优质实现
// 他是在vscode下调试通过的

// 我本地有VS, 就用VS console工程来实验
// build on vs2022 console

// 编译0错误, 0警告
// 运行起来结果正确
// qq_45279840@csdn 的实现NB, 代码行数很少

#include <iostream>
using namespace std;

#define MAX(T) T ADD_##T(T x, T y) { return x + y; }

MAX(int);
MAX(float);
MAX(string);

#define ADD(T) ADD_##T

int main()
{
	cout << ADD(int)(1, 2) << endl;
	cout << ADD(float)(1.0f, 2.2f) << endl;
	cout << ADD(int)(10, 20) << endl;
	cout << ADD(string)("hello", "world") << endl;

	/* run result
	3
	3.2
	30
	helloworld
	*/

	return EXIT_SUCCESS;
}

看看预编译结果

重新编译, 报错, 但是生成了.i

这就够了, 可以看.i中的预处理编译结果.

 .i文件蛮大的, 用vscode打开后, 拉到最后

#pragma warning(pop)
#pragma pack(pop)
#line 75 "C:\\Program Files\\Microsoft Visual Studio\\2022\\Professional\\VC\\Tools\\MSVC\\14.33.31629\\include\\iostream"
#line 76 "C:\\Program Files\\Microsoft Visual Studio\\2022\\Professional\\VC\\Tools\\MSVC\\14.33.31629\\include\\iostream"
#pragma external_header(pop)
#line 12 "D:\\my_dev\\my_local_git_prj\\soft\\micro_template\\csdn_micro_template\\csdn_micro_template.cpp"
using namespace std;



int ADD_int(int x, int y) { return x + y; };
float ADD_float(float x, float y) { return x + y; };
string ADD_string(string x, string y) { return x + y; };



int main()
{
	cout << ADD_int(1, 2) << endl;
	cout << ADD_float(1.0f, 2.2f) << endl;
	cout << ADD_int(10, 20) << endl;
	cout << ADD_string("hello", "world") << endl;

	






	return 0;
}

qq_45279840@csdn同学的思路很优秀, 学到很多.

另外说一下, 大家讨论问题时, 不要气氛那么火爆.

工程师一起讨论问题, 难免有点误会, 毕竟大家不是面对面的同事.

先发言的人, 如果因为一些误会, 先莫名其妙的火爆起来, 另外一个人不火爆也不行啊.

我真没见过几个技术NB, 脾气还好的人.

见过几个, 但是人家不是大学的博士, 就是领域内的专家, 人家根本不会在这些技术枝节问题的讨论上带任何情绪.

不过, 大家都是就事论事, 都是路人, 也没仇没怨的. 将误会说明, 消除误会就好了.

也许每次讨论问题, 都是我们这辈子最后一次讨论问题.

不管因为什么样的原因, 大家能在一起讨论问题, 也算是一种缘分, 孽缘也是缘分的一种.

我的讨论问题习惯:

* 如果你要讨论问题, 留了言. 我看到之后, 觉得需要讨论, 就会讨论并留言. 但是你在1天之内没有回复我的讨论留言, 那么我就认为这个问题已经讨论完了, 不存在玩不起的问题. 技术上的事情都是微不足道的小事情, 不存在面子的问题. 讨论完, 大家都有提高.

* 讨论完问题, 如果有价值, 会做个笔记.

* 保留讨论的留言1天, 如果在这1天内, 没有新的讨论出现, 那说明大家不需要再讨论了, 那就将讨论的留言删除. 留言本身没有保存的价值. 价值已经在大家的讨论交互过程中实现了, 大家都已经得到了提高.

为啥说留言本身没有保存的价值呢? 如果在网上写技术笔记的同学就有体会.

e.g. 有人要讨论问题, 留言了, 你回了一个讨论留言. 然后这个人就消失了. 那这种留言, 摆在哪里有什么价值呢? 

e.g. 我看见有同学要讨论问题, 我回了留言, 这个人就消失了, 那我1天之后,将这个没有任何意义的留言删了. 又过了3天, 这个同学又来继续讨论此前的问题, 指责我将他留言删了, 玩不起. WoKao, 你有没有想过, 你为啥没有及时回复别人给你的留言呢?

e.g. 有人留言了, 但是我无法理解. 那就让留言留1天, 删掉就好.

e.g. 如果大家讨论有成果, 这个成果会作为笔记补充. 留言本身也没有任何意义.

总之, 大家讨论问题是有益的, 可以共同进步, 共同提高. 双赢啊.

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值