C++ 如何在不使用宏预处理器的情况下使用“
为了支持使用日志记录字符串C++ 如何在不使用宏预处理器的情况下使用“,c++,macros,c-preprocessor,C++,Macros,C Preprocessor,为了支持使用日志记录字符串 有没有一种方法可以让my_log_在一个可以接收参数的真实函数中变得有趣,比如这是可能的,但不能以一种保留my_log_FunHelloodes的方式。这一定是为什么人们似乎喜欢前置处理器?假设它有它的用途,但这不是其中之一。让my_log_成为一个函数,并从中返回一个适当的std::ostream&怎么样?它使用起来非常方便,您可能会在其他答案中找到一些帮助,例如:3。可以在没有递归的情况下完成:{int dummy[]={os哦,很好!除了将变量模板转发到另一个非
有没有一种方法可以让my_log_在一个可以接收参数的真实函数中变得有趣,比如这是可能的,但不能以一种保留my_log_FunHelloodes的方式。这一定是为什么人们似乎喜欢前置处理器?假设它有它的用途,但这不是其中之一。让my_log_成为一个函数,并从中返回一个适当的std::ostream&怎么样?它使用起来非常方便,您可能会在其他答案中找到一些帮助,例如:3。可以在没有递归的情况下完成:{int dummy[]={os哦,很好!除了将变量模板转发到另一个非变量函数之外,我还没有对变量模板做太多处理,所以我还不知道使用参数包可以做些什么。
my_log_fun("hello"<<"world") //In the real case, people can pass variables
#define my_log_fun(out) \
ostringstream os; \
os << out; \
play_with(os) \
class MyLogger {
public:
MyLogger(std::ostream& logStream)
: logStream_(logStream)
{}
template<typename T>
friend MyLogger& operator<<(MyLogger&, const T&);
private:
std::ostream& logStream_;
};
template<typename T>
MyLogger& operator<<(MyLogger& log, const T& value) {
log.logStream_ << value;
return log;
}
int main() {
MyLogger log(std::cout);
log << "Hello" << " World!";
}
template<typename... Args> void do_my_log_fun(ostream& os, Args... args);
template<typename T> void do_my_log_fun(ostream& os, T arg) {
os << arg;
}
template<typename T, typename... Rest>
void do_my_log_fun(ostream& os, T arg1, Rest... args) {
do_my_log_fun(arg1);
do_my_log_fun(args);
}
template<typename... Args> void my_log_fun(Args... args) {
ostringstream os;
do_my_log_fun(os, args...);
play_with(os);
}
enum LoggerProxy {logger};
template<typename T>
ostream operator<< (LoggerProxy lhs, T rhs) {
ostringstream os;
return os << rhs;
}
void my_log_fun(ostream& os) {
play_with(os);
}
my_log_fun(logger<<"hello"<<"world");