c++ - 从模板函数返回匿名结构(用于结构化绑定(bind))

标签 c++ c++17

我想使用新的 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; /*...*/});
   // ...
};

Demo

关于c++ - 从模板函数返回匿名结构(用于结构化绑定(bind)),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/70695389/

相关文章:

c++ - 尝试设置 openCV、MinGW 编译器时出现 CMake 错误

c++ - 用 'grouped'元素迭代 vector ?

c++ - 如何在类模板的成员函数中正确调用函数对象?正在生成 Visual Studio 编译器错误 C2440

c++ - 将调用哪个重载模板?

c++ - 将类型特征与可变参数模板参数一起使用

c# - 从 C# 使用 DirectX DLL (C++)

c++ - <string> 和 <string.h> 之间的区别?

c++ - 我怎样才能从它的多重继承基础中获得一个类地址?

c++ - 解决 C++ 中的最小交换 hackerrank 问题

c++ - 如何有效地为 `string_view` 的子字符串获取 `std::string`