从不同的数据类型(字符串文字、整数变量、布尔值等)创建单个字符串。通过使用 cpp 中可用的可变模板变量

问题描述 投票:0回答:1
#define DLT_LOG(...) prepare_String(__VA_ARGS__)

template<class... Msg> std::string prepareMsg(Msg... message)
{
std::stringstream streamMsg;
(streamMsg << ... << message) << std::endl;
return streamMsg.str();
}

int main()
{
int some_integer_value = 10;
float some_float_value = 3.141;
uint8_t some_status = 0;
LOG(1, "this is a message", some_float_value, some_integer_value, some_status );
LOG("an example message");
}

在执行上述函数时,我面临“检测到堆栈粉碎****”。 我的观点是,当内存地址传递到上面的宏时,它会导致此错误。

预期输出1 这是一条消息 10 3.141 0
示例消息

c++ variadic-templates stringstream
1个回答
0
投票

如果您无法使用 C++20 或库,那么您根本不需要宏(如果可以的话甚至避免使用它们)。然后记录代码可能如下所示:

#include <iostream>
#include <sstream>
#include <string_view>

template<typename arg_t, typename... args_t>
void log(std::ostream& os, arg_t&& arg, args_t&&... args)
{
    os << std::forward<arg_t>(arg);
    ((os << " " << std::forward<args_t>(args)), ...); // fold expression that inserts an extra space
}


int main()
{
    int some_integer_value = 10;
    float some_float_value = 3.141f;
    uint8_t some_status = 0;
    log(std::cout, 1, "this is a message", some_float_value, some_integer_value, some_status );

    return 0;
}
© www.soinside.com 2019 - 2024. All rights reserved.