大神请求助!完成一个类似printf中的format功能

xiaoyin35 2021-02-16 03:54:05
蒻菊又双叒叕来求救了!
我要完成这样一个效果:

#include <bits/stdc++.h>
using namespace std;

template <string mod, class... cls>
class Pack
{
//...大神编写...
};

Pack<"(int):(c),(23cd)", int, char, bool> getBit(int i, char c, bool b)
{
Pack<"(int):(c),(23cd)", int, char, bool> rsl_t;
rsl_t.setthing("int", i);
rsl_t.setthing("c", c);
rsl_t.setthing("23cd", b);
return rsl_t;
}

Pack<"(int)::(c),[NOT(ppt)];[LEN(els)]", int, char, bool, string> getByte(int i, char c, bool b, string els)
{
Pack<"(int)::(c),[NOT(ppt)];[LEN(els)]", int, char, bool, string> rsl_t;
//...略...
return rsl_t;
}

int main()
{
cout << getBit(2021, '+', true);
cout << endl << getByte(2022, '-', true, "something");
return 0;
}

期望输出:

2021:+,true
2022::-,false;9

Pack是一个模板类,我打算用它实现一个format功能:
首先string是模式字符串,后面是class(填充的东西的类型)
也可以改为:"(int:its)"这种类型:名称这种,就不用上面的后面class了,大神看那种好实现。

有两个内置函数(可以再添):
方法:"...[函数名(填入物品名称/物品类型:物品名称(两种选择,看那种好实现)]..."

针对bool类型的NOT函数:
"...[NOT(bool:ygbool)]..."或"...[NOT(ygbool)]..."

针对string的LEN函数:
"...[LEN(string:ygstring)]..."或"...[LEN(ygstring)]..."

NOT是取反,LEN是求长
...全文
429 16 打赏 收藏 转发到动态 举报
写回复
用AI写文章
16 条回复
切换为时间正序
请发表友善的回复…
发表回复
xiaoyin35 2021-03-02
  • 打赏
  • 举报
回复
emmmm………………
SleekStone 2021-02-28
  • 打赏
  • 举报
回复
你都不明白那你怎么弄,这不是需求不明确么,你要是需求明确点我有时间可以帮你写一个...
xiaoyin35 2021-02-28
  • 打赏
  • 举报
回复
引用 13 楼 SleekStone 的回复:
哦 我总算明白了 你的意思是pack类里面除了值以外还要存名字啊,相当于<name,value>这种,在你的输出里没看到名字有什么用啊,那你这个函数: Pack<"(int):(c),(23cd)", int, char, bool> getBit(int i, char c, bool b) { Pack<"(int):(c),(23cd)", int, char, bool> rsl_t; rsl_t.setthing("int", i); rsl_t.setthing("c", c); rsl_t.setthing("23cd", b); return rsl_t; } 只能返回名字为int,c, 23cd的Pack<>对象哦,不能返回名字为int1, c1 23cd1的pack<>对象?尽管他们的类型都是int char bool?如果是这样那你岂不是每个pack<>的实例化都要重载一个getbit函数?而且如果类型相同只是名字不一样的的话还不能用函数重载,因为只是返回值类型不一样,用起来会很麻烦,失去了模板的灵活性
……………………………………我也不明白…………………………………………
SleekStone 2021-02-27
  • 打赏
  • 举报
回复
哦 我总算明白了 你的意思是pack类里面除了值以外还要存名字啊,相当于<name,value>这种,在你的输出里没看到名字有什么用啊,那你这个函数: Pack<"(int):(c),(23cd)", int, char, bool> getBit(int i, char c, bool b) { Pack<"(int):(c),(23cd)", int, char, bool> rsl_t; rsl_t.setthing("int", i); rsl_t.setthing("c", c); rsl_t.setthing("23cd", b); return rsl_t; } 只能返回名字为int,c, 23cd的Pack<>对象哦,不能返回名字为int1, c1 23cd1的pack<>对象?尽管他们的类型都是int char bool?如果是这样那你岂不是每个pack<>的实例化都要重载一个getbit函数?而且如果类型相同只是名字不一样的的话还不能用函数重载,因为只是返回值类型不一样,用起来会很麻烦,失去了模板的灵活性
xiaoyin35 2021-02-26
  • 打赏
  • 举报
回复
引用 11 楼 SleekStone 的回复:
[quote=引用 9 楼 xiaoyin35 的回复:][quote=引用 7 楼 SleekStone 的回复:]没看明白你Pack<"(int):(c),(23cd)", int, char, bool>里的23cd和Pack<"(int)::(c),[NOT(ppt)];[LEN(els)]"里的ppt及els是什么意思 按理说格式化这种东西这里应该是一个确定的代表一定意义的格式 比如你这里的int代表int类型 c代表一个字符 那23cd、ppt、els代表什么呢?
主要因为前面的方法是: Pack<"(int):(c),(23cd)", ...> 机器不知道int,c和23cd代表什么类型所以后面又int, char, bool 但是后面的可能是: Pack<"(int:c),[NOT(bool:ppt)];[LEN(string:els)]"> 中是有类型名(类型:名字) 这两种方法是任选一个实现。[/quote] 还是没明白你说的“Pack<"(int):(c),(23cd)", ...> 机器不知道int,c和23cd代表什么类型所以后面又int, char, bool”这个是什么意思,后面那句我看明白了,但是不明白那个名字有什么用,我看你那个输出也没用到名字啊[/quote] 可以设置构造函数里有名字对应值,前面的int, char, bool是class cls...是表示这些值的类型啊~
SleekStone 2021-02-26
  • 打赏
  • 举报
回复
引用 9 楼 xiaoyin35 的回复:
[quote=引用 7 楼 SleekStone 的回复:]没看明白你Pack<"(int):(c),(23cd)", int, char, bool>里的23cd和Pack<"(int)::(c),[NOT(ppt)];[LEN(els)]"里的ppt及els是什么意思 按理说格式化这种东西这里应该是一个确定的代表一定意义的格式 比如你这里的int代表int类型 c代表一个字符 那23cd、ppt、els代表什么呢?
主要因为前面的方法是: Pack<"(int):(c),(23cd)", ...> 机器不知道int,c和23cd代表什么类型所以后面又int, char, bool 但是后面的可能是: Pack<"(int:c),[NOT(bool:ppt)];[LEN(string:els)]"> 中是有类型名(类型:名字) 这两种方法是任选一个实现。[/quote] 还是没明白你说的“Pack<"(int):(c),(23cd)", ...> 机器不知道int,c和23cd代表什么类型所以后面又int, char, bool”这个是什么意思,后面那句我看明白了,但是不明白那个名字有什么用,我看你那个输出也没用到名字啊
bluesen 2021-02-25
  • 打赏
  • 举报
回复
直接用snprintf()不行吗
SleekStone 2021-02-25
  • 打赏
  • 举报
回复
没看明白你Pack<"(int):(c),(23cd)", int, char, bool>里的23cd和Pack<"(int)::(c),[NOT(ppt)];[LEN(els)]"里的ppt及els是什么意思 按理说格式化这种东西这里应该是一个确定的代表一定意义的格式 比如你这里的int代表int类型 c代表一个字符 那23cd、ppt、els代表什么呢?
xiaoyin35 2021-02-25
  • 打赏
  • 举报
回复
引用 6 楼 xiaoyin35 的回复:
[quote=引用 5 楼 taodm 的回复:]template <string mod, class... cls> class Pack { //...大神编写... }; 对比下面这样的传统写法,有什么突破性的价值? template <class... cls> class Pack { Pack(string mod)。。。 };
引用 5 楼 taodm 的回复:
template <string mod, class... cls> class Pack { //...大神编写... }; 对比下面这样的传统写法,有什么突破性的价值? template <class... cls> class Pack { Pack(string mod)。。。 };
Nothing就是cls可以去掉[/quote] 主要就是同样的cls,一半mod不会一样,而mod同样,cls一半也不会一样,所以 template<string mod> class Pack { Pack(class cls...); }; 我也不满意~
xiaoyin35 2021-02-25
  • 打赏
  • 举报
回复
引用 7 楼 SleekStone 的回复:
没看明白你Pack<"(int):(c),(23cd)", int, char, bool>里的23cd和Pack<"(int)::(c),[NOT(ppt)];[LEN(els)]"里的ppt及els是什么意思 按理说格式化这种东西这里应该是一个确定的代表一定意义的格式 比如你这里的int代表int类型 c代表一个字符 那23cd、ppt、els代表什么呢?
主要因为前面的方法是: Pack<"(int):(c),(23cd)", ...> 机器不知道int,c和23cd代表什么类型所以后面又int, char, bool 但是后面的可能是: Pack<"(int:c),[NOT(bool:ppt)];[LEN(string:els)]"> 中是有类型名(类型:名字) 这两种方法是任选一个实现。
xiaoyin35 2021-02-20
  • 打赏
  • 举报
回复
引用 5 楼 taodm 的回复:
template <string mod, class... cls> class Pack { //...大神编写... }; 对比下面这样的传统写法,有什么突破性的价值? template <class... cls> class Pack { Pack(string mod)。。。 };
引用 5 楼 taodm 的回复:
template <string mod, class... cls> class Pack { //...大神编写... }; 对比下面这样的传统写法,有什么突破性的价值? template <class... cls> class Pack { Pack(string mod)。。。 };
Nothing就是cls可以去掉
taodm 2021-02-18
  • 打赏
  • 举报
回复
template <string mod, class... cls> class Pack { //...大神编写... }; 对比下面这样的传统写法,有什么突破性的价值? template <class... cls> class Pack { Pack(string mod)。。。 };
xiaoyin35 2021-02-18
  • 打赏
  • 举报
回复
引用 2 楼 taodm 的回复:
这个的价值在哪里?
我后面做算价程序有用
yshuise 2021-02-17
  • 打赏
  • 举报
回复
存放字符串可以?指针可以我知道可以的。
taodm 2021-02-16
  • 打赏
  • 举报
回复
这个的价值在哪里?
maguangzhi 2021-02-16
  • 打赏
  • 举报
回复
构造函数中使用sizeof...(cls)可以得到实际类型参数个数,然后考虑建立几元组(tuple).

64,637

社区成员

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

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