[讨论] 有无匿名ostream物件做string format?

楼主: Killercat (杀人猫™)   2017-11-27 11:21:09
目前在改一个非常legacy的专案,Log function signature基本上写死了没办法改 :
Log(const char* type, const char* client, const char* log);
以前看他们都是写成这样
char log[48];
sprintf(log, "This is a PEN : %s PINEAPPLE!");
Log(TYPE, CLIENT, log);
这写法显然是有问题的,但是这个VC6等级的编译器又不支援sprintf_n
更不用说这其实挺麻烦的
所以后期我就把它改写成这样
stringstream log;
log << "This is a PEN : " << pen << " PINEAPPLE!";
Log(TYPE, CLIENT, log.str().c_str());
但是显然这还是有点麻烦
自己是写了一个ostream拼贴物件让他看起来像是这样
包含了一个operator const char*()
Log(TYPE, CLIENT, log << "This is a PEN : " << pen << " PINEAPPLE!");
来让他能够串起来,让他能够吃大多数的变量型别
问题来了,有没有std函数能满足这个需求?
Log希望能让他们写的方便一点,不然他们一个个都不想Log了 -o-||
作者: galic (嘎利)   2017-11-27 11:38:00
看不太懂你的需求耶... 为何不function overloading一个Log(TYPE, CLIENT, FMT, ...) 的版本就好而且就算没有snprintf或是sprintf_s 你也可以用strlen自干
楼主: Killercat (杀人猫™)   2017-11-27 12:23:00
尽量避免用...吧,型别不明满难debug的是能自干 不过就是用起来麻烦我是弄了一个stream物件做这件事 只是看有没有std能用我是直接把stringstream加一个const char* operator XD
作者: galic (嘎利)   2017-11-27 13:16:00
我不懂的点就是 你既然要方便 就包成一个函式在里面处理复杂的事情 呼叫的人不用管这么多 这不就是方便?结果你一直找std有没有支援这个你要作到type-safe就用variadic templates.. 但是版本又很旧不支援 那就只能去重载 () 或是 << 达到类似效果 你不就已经用类似方法达到?
楼主: Killercat (杀人猫™)   2017-11-27 14:08:00
我的点是,我是土炮弄了个出来,但看看有没有std已经有类似的solution,土炮总是比不上标准好就是土炮完以后觉得这case应该满常见的 所以想看看std是不是已经有类似解,有的话我会倾向用std取代土炮以一个coder来讲,寻求一个漂亮的轮子,总比自己打得好
作者: jasonwu23 (jasonwu)   2017-11-27 18:48:00
你sprintf范例有点怪
楼主: Killercat (杀人猫™)   2017-11-28 06:41:00
对,少打一个参数 拍写 XD
作者: galic (嘎利)   2017-11-28 09:39:00
说真的啦 你提着一个VC6的专案说在找漂亮的轮子… 不要侮辱人的智商啊
楼主: Killercat (杀人猫™)   2017-11-28 13:21:00
条件也列了 该试的也写出来了 你被侮辱到怪我哩讲的好像是我不想把专案升级一样(耸肩不过vc6本来就非长久之计 我上来也在想办法干掉他
作者: galic (嘎利)   2017-11-29 19:30:00
我是在酸你逻辑不通 是不是没在动脑... 算了我是以为你的目的是让其他使用Logging的人 觉得方便...原来你是在求自己方便format一直都没进过std,订std比你想的复杂多了而且你的土炮叫做concatenate 不是formatting

Links booklink

Contact Us: admin [ a t ] ucptt.com