gpt4 book ai didi

c++ - 接受记录器的可变数量的参数

转载 作者:塔克拉玛干 更新时间:2023-11-03 07:33:22 27 4
gpt4 key购买 nike

我不知道这是否可以通过可变参数模板、可变参数宏甚至元编程来实现。

基本上我有一个像这样的日志记录对象:

LOG << "This is the value of variable X: " << varaibleX;

但我也希望它能够像函数一样使用LOG

LOG ( "This is the value of variable X: ", variableX);

但参数的数量可以变化。 (假设他们的调用可以转换成流)

我正在查看 LOG ( ... ),但真的不确定如何扩展参数。

假设有人写了

LOG(X, Y, Z);

我想将其扩展为:

LOG << X << Y << Z;

这可以做到吗?

最佳答案

这可以通过下面的可变参数模板来完成。由于不清楚你的 LOG 对象是什么,我省略了实际调用 LOG(...) 的代码,但你应该能够移植它做你需要的:

#include <iostream>

/**
* A specialization to stream the last argument
* and terminate the recursion.
*/
template<typename Stream, typename Arg1>
Stream & DoLog(Stream & stream, const Arg1 & arg1)
{
return (stream << arg1);
}

/**
* Recursive function to keep streaming the arguments
* one at a time until the last argument is reached and
* the specialization above is called.
*/
template<typename Stream, typename Arg1, typename... Args>
Stream & DoLog(Stream & stream, const Arg1 & arg1, const Args&... args)
{
return DoLog((stream << arg1), args...);
}

int main()
{
DoLog(std::cout, "First ", 5, 6) << " Last" << std::endl;
}

您需要使用 c++0x 支持对其进行编译。对于 g++,这可以使用 --std=c++0x 标志来完成。

关于c++ - 接受记录器的可变数量的参数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9204780/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com