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");