如何解决无法在采用参数包并返回 vector<string> 的初始值设定项列表中直接定义 lambda
我有以下代码可以正常工作,to_string 函数接受一个参数包并返回一个字符串向量。函数中定义的 lambda 只是将每个参数转换为一个字符串(解包发生在初始化列表 {} 中):
#include <iostream>
#include <sstream>
#include <string>
#include <vector>
template <typename...Args>
auto to_string(const Args& ...params) -> std::vector<std::string>
{
const auto to_str = [](const auto& p) {
std::stringstream ss;
ss << p;
return ss.str();
};
return {to_str(params)...};
}
int main()
{
auto vec = to_string(1,1.2,1.5f,"test");
for (const auto &item : vec)
{
std::cout << item << '\n';
};
return 0;
}
我想要做的是不必在返回调用之前定义 lambda,只需在初始化列表中使用它,就像这样(也许),但它不起作用:
template <typename...Args>
auto to_string(const Args& ...params) -> std::vector<std::string>
{
return {[](const auto& p) {
std::stringstream ss;
ss << p;
return ss.str();
}()...};
}
gcc 说 lambda 应该接受我不想要的参数包:
test.cpp: In function 'std::vector<std::__cxx11::basic_string<char> >
to_string(const Args& ...)':
test.cpp:13:8: error: expansion pattern '<lambda>()' contains no parameter packs
13 | }()...};
| ^~~
test.cpp:13:11: error: could not convert '{<expression error>}' from '<brace-enclosed initializer list>' to 'std::vector<std::__cxx11::basic_string<char> >'
13 | }()...};
| ^
| |
| <brace-enclosed initializer list>
解决方法
在评论部分添加@Justin提供的答案:Params需要传递给lambda调用:
template <typename...Args>
auto to_string(const Args& ...params) -> std::vector<std::string>
{
return {[](const auto& p) {
std::stringstream ss;
ss << p;
return ss.str();
}(params)...};
}
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。