【发布时间】:2016-10-27 16:43:37
【问题描述】:
通常对于 C++ 中的类的重载运算符
template <typename T>
void operator<< (const T &t)
{
ostringstream stream;
stream << t;
// more code
}
我想知道是否有可能使 operatorva_list 创建一个方法来格式化字符串并传递其他参数,例如:
void CBcLogger::print(MLL::ELogLevel lvl, const char* text, ...)
正如您在上述方法中看到的,我可以传递要格式化的文本以及lvl 参数。如果我想使用operator<<,我是否能够以某种方式压缩更多参数而不仅仅是运算符?类似的东西
void multiParamFunc(const unsigned int logLevel, "operator<< here")
我知道这不是正确的语法,但我只是想说明一点。
我将不胜感激有关此案的所有帮助。 另外,我问这个关于纯 c++ 的问题,但最后我会将它与 QT 一起使用。也许这个框架提供了更多的功能?
编辑:我正在制作一个记录器框架。我需要一个允许添加日志行的函数,该行用它的日志杠杆(调试、信息、错误等。它是一个枚举)和一个可以用 operator
例如,print 调用如下所示:
print(MLL::ERROR, "Some text to format %u %i %f", 1, -1, 3.14f);
如您所见,我可以将日志级别参数传递给此函数。我想知道如何使用 operator 实现类似的功能
【问题讨论】:
-
这是一个经典的 XY 问题:您要问如何实现特定的解决方案,但我们不知道解决方案 什么?你想解决什么问题? 为什么您关心
multiParamFunc接收方法指针(或类型工厂,可能是)?请编辑问题以描述您尝试解决的一般问题,并解释为什么您甚至认为传递运算符是一个好主意。此外,C 风格的可变参数函数不是类型安全的,通常不应使用。现在是 C++11 时代,你不需要它们! -
我编辑了问题
-
将 QStrings 传递给您的记录器是否有问题(理论上它无论如何都需要将它们转换为?)如果没有问题,只需使用
asprintf -
我可以这样做,但它看起来不太好,我必须执行类似 `print(MLL:ERROR, "the string %s", myQString.tostd().c_str())' 之类的操作.我不介意函数内部的额外转换只是想尽可能少地写入参数。
-
我仍然不知道你想做什么。忘记
operator<<:毕竟,这是一个实现细节。 你想做什么?举一个例子,不使用operator<<,但仍然做你想做的事。
标签: c++ qt operator-overloading operator-keyword