我想使用新的 C++17 功能,并想使用结构化绑定(bind)从(模板)函数返回多个值。我可以让它运行,但我希望它运行更好。 代码的简化版本是(真正的代码更大并且有更好的变量名):
template <class O>
struct {
int a;
double b;
} F(int i,O o) {
return {i, o(i)};
}
void foo(int i) {
auto [a,b]=F(i, [=](int k)->double {return 1.0/k; /*...*/});
// ...
};
匿名结构和模板函数的组合在 VS 2019 中不起作用,所以我不得不写:
struct Dummy {
int a;
double b;
};
template <class O>
Dummy F(int i,O o) {
return {i, o(i)};
}
void foo(int i) {
auto [a,b]=F(i, [=](int k)->double {return 1.0/k; /*...*/});
// ...
};
或:
template <class O>
std::tuple<int,double> F(int i,O o) {
return {i, o(i)};
}
void foo(int i) {
auto [a,b]=F(i, [=](int k)->double {return 1.0/k; /*...*/});
// ...
};
偏好:
- 我不需要返回类型结构,因此我更喜欢匿名变体, 我知道它适用于非模板函数。
- 我希望结构中的成员名称用于文档目的,因此我发现元组变体不太清楚。 (对于更多相同类型的成员,这尤其是一个问题。)
那么,对于模板函数来说,最好的处理方法是什么?
错误信息是:
- 错误 C2143:语法错误:缺少“;”在“标识符”之前
- error C2332: 'struct': 缺少标签名称
- error C3306: '': > 不允许未命名的类模板
最佳答案
局部结构如何:
template <class O>
auto F(int i, O o) {
struct {
int a;
double b;
} res {i, o(i)};
return res;
}
void foo(int i) {
auto [a,b] = F(i, [=](int k)->double {return 1.0/k; /*...*/});
// ...
};
关于c++ - 从模板函数返回匿名结构(用于结构化绑定(bind)),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/70695389/