c++ - 如何为 std::cout 制作可变参数宏?

标签 c++ c++11 c-preprocessor

我如何制作一个宏,它接受可变数量的参数,并使用 std::cout 打印出来?抱歉,如果这是一个新手问题,在搜索答案后找不到任何可以阐明可变参数宏的内容。

概念示例:

#include <iostream>
#define LOG(...) std::cout << ... << ... << std::endl
int main() {
    LOG("example","output","filler","text");
    return 0;
}

会输出:

exampleoutputfillertext

最佳答案

您不需要预处理器宏来执行此操作。可以写成普通的 C++。在 C++11/14 中:

#include <iostream>
#include <utility>

void log(){}

template<typename First, typename ...Rest>
void log(First && first, Rest && ...rest)
{
    std::cout << std::forward<First>(first);
    log(std::forward<Rest>(rest)...);
}

int main()
{
    log("Hello", "brave","new","world!\n");
    log("1", 2,std::string("3"),4.0,'\n');
}

Live demo

在 C++17 中:

template<typename ...Args>
void log(Args && ...args)
{
    (std::cout << ... << args);
}

就够了。 Live demo

输出:

Hellobravenewworld!
1234

研究 variadic templates , parameter packsfold expressions 而不是可变参数宏,后者在现代 C++ 中很少有用。

关于c++ - 如何为 std::cout 制作可变参数宏?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29326460/

相关文章:

c++ - sstream 使用输入和输出文件

c++ - 什么时候应该使用 const_iterator 而不是 auto

c++ - 带 std::index_sequence 的三元运算符

c++ - 使用 std::array 的代码大小

c++ - 避免重新定义预处理器变量

c++ - RVO, move 语义和优化代码的斗争

动态数组的 C++ 内存泄漏

c - 用宏包装函数调用

C 预处理器宏替换#if#else 语句

c++ - C/C++ 使用内存值预定义数组