5

例如,我有一堂课

struct A {int a; bool b;};

我想生成一个模板函数来获取它的元素(比如 std::get 来获取一个元组元素)

template<unsigned i, class T>
auto Get(T& t);

template<>
int& Get<0, A>(A& a)
{
    return a.a;
}

template<>
bool& Get<1, A>(A& a)
{
    return a.b;
}


int main()
{
    A a;
    Get<0>(a) = 10;
    Get<1>(a) = true;
    return 0;
}

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

4

1 回答 1

20

假设您不介意以“手动方式”进行此操作,您可以非常简单地做到这一点。

#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
于 2013-07-13T04:59:29.987 回答