2013-07-13 23 views
5

Ví dụ, tôi có một lớpLàm thế nào để tạo ra một std :: có được như chức năng cho lớp học của tôi?

struct A {int a; bool b;}; 

Và tôi muốn tạo ra một hàm template để có được các yếu tố của nó (như std :: get để có được một yếu tố tuple)

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; 
} 

Trên đây mã không hoạt động. Thách thức là tôi không biết loại Get được trả về cho lớp tùy ý. Bất kỳ cách nào để thực hiện nó? Cảm ơn.

+0

Xác định "không làm việc" xin vui lòng – RiaD

+0

Bạn không thể một phần chuyên chức năng mẫu. Bạn sẽ phải cung cấp một số cơ chế bên trong 'struct A' nếu bạn muốn' Get' làm việc trên các kiểu khác nhau (hoặc một cách tiếp cận giống như đặc điểm). Đối với các lớp giống như tuple, bạn có thể sử dụng các thủ thuật với các mẫu variadic. – dyp

Trả lời

20

Giả sử bạn không ngại làm điều này theo cách thủ công, bạn có thể thực hiện điều này thật đơn giản.

#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; 
} 

Output:

10 
1 
+0

sử dụng 'std :: tie' thay vì' std :: forward_as_tuple' và bạn nhận được phiếu bầu của mình. –

Các vấn đề liên quan