C++ 如何为我的类生成std::get like函数?

C++ 如何为我的类生成std::get like函数?,c++,templates,c++11,C++,Templates,C++11,例如,我有一门课 struct A {int a; bool b;}; 我想生成一个模板函数来获取它的元素(比如std::get来获取tuple元素) 模板 自动获取(T&T); 模板 int&Get(A&A) { 返回a.a; } 模板 bool&Get(A&A) { 返回a.b; } int main() { A A; 得到(a)=10; 得到(a)=真; 返回0; } 上面的代码不起作用。挑战在于我不知道为任意类返回的Get类型。有什么办法可以实施吗?谢谢。如果您不介意以“手动方式”进

例如,我有一门课

struct A {int a; bool b;};
我想生成一个模板函数来获取它的元素(比如std::get来获取tuple元素)

模板
自动获取(T&T);
模板
int&Get(A&A)
{
返回a.a;
}
模板
bool&Get(A&A)
{
返回a.b;
}
int main()
{
A A;
得到(a)=10;
得到(a)=真;
返回0;
}

上面的代码不起作用。挑战在于我不知道为任意类返回的Get类型。有什么办法可以实施吗?谢谢。

如果您不介意以“手动方式”进行此操作,您可以非常简单地完成此操作

#include <tuple>

struct A {
    int a; bool b;
};

template<size_t N>
auto get(A& a) -> decltype(std::get<N>(std::tie(a.a, a.b))) {
    return std::get<N>(std::tie(a.a, a.b));
}

#include <iostream>

int main() {
    A a;
    get<0>(a) = 10;
    get<1>(a) = true;
    std::cout << a.a << '\n' << a.b;
}

请定义“不起作用”您不能部分专门化函数模板。如果希望
Get
处理不同的类型(或类似于traits的方法),则必须在
struct A
内部提供一些机制。对于类似元组的类,您可以使用可变模板的技巧。使用
std::tie
而不是
std::forward\u as\u tuple
,您就得到了我的投票。
#include <tuple>

struct A {
    int a; bool b;
};

template<size_t N>
auto get(A& a) -> decltype(std::get<N>(std::tie(a.a, a.b))) {
    return std::get<N>(std::tie(a.a, a.b));
}

#include <iostream>

int main() {
    A a;
    get<0>(a) = 10;
    get<1>(a) = true;
    std::cout << a.a << '\n' << a.b;
}
10
1