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

Returning anonymous struct from template function (for structured binding)

我想使用新的 C++17 功能,并想使用结构化绑定来 return 来自(模板)函数的多个值。我可以让它工作,但我希望它工作 更好。 代码的简化版本是(真正的代码更大并且有更好的变量名):

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; /*...*/});
   // ...
};

偏好:

那么,处理模板函数的最佳方法是什么?

错误信息是:

局部结构如何:

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

我建议使用 std::tuple(或本例中的 std::pair)。例如

#include<tuple>

template <class O>
auto F(int i,O o) {
   return std::tuple{i, o(i)};
}
void foo(int i) {
   auto [a,b]=F(i, [=](int k)->double {return 1.0/k; /*...*/});
   // ...
};