2017-08-14 27 views
5

Với std::variant<int, bool> Tôi có thể gọi std::get<0>(var) để lấy giá trị trong biến thể là loại đầu tiên - int.Nhận mục theo chỉ mục từ tăng :: biến thể giống như có thể với std :: variant

Tôi làm cách nào để thực hiện điều này với boost::variant? boost::get<> dường như chỉ hỗ trợ nhận theo loại chứ không phải theo chỉ mục và tôi thấy tài liệu rất khó hiểu.

+0

Có vẻ như bạn không thể. –

+0

@BaummitAugen và có cách nào để hack nó không? có lẽ với một số shenanigans mpl? – onqtam

+0

Rất có thể là có. Tiêu chuẩn gì? –

Trả lời

5

Điều này dường như không được bao gồm trong tăng cường.

Tuy nhiên, với sự giúp đỡ của this answer, chúng ta có thể chỉ đơn giản là vai trò của chính chúng ta:

template<int N, typename... Ts> using NthTypeOf = 
     typename std::tuple_element<N, std::tuple<Ts...>>::type; 

template<int N, typename... Ts> 
auto &get(boost::variant<Ts...> &v) { 
    using target = NthTypeOf<N, Ts...>; 
    return boost::get<target>(v); 
} 

template<int N, typename... Ts> 
auto &get(const boost::variant<Ts...> &v) { 
    using target = NthTypeOf<N, Ts...>; 
    return boost::get<target>(v); 
} 

int main() { 
    boost::variant<int, double> v = 3.2; 
    std::cout << get<1>(v); 
} 

Xem nó live.

Quá tải con trỏ có thể được thêm tương tự nếu muốn.

+1

vâng xấu của tôi - const-ness được tuyên truyền đúng cách chỉ bằng cách sử dụng tự động. Cảm ơn câu trả lời! IMHO này cần phải được thêm vào '' 'boost :: variant''' ... – onqtam

+0

@onqtam Không bao giờ cố gắng đóng góp, nhưng tôi đoán bạn có thể gửi một bản vá. Không thấy lý do tại sao họ sẽ chống lại việc có nó. (Không chắc chắn những gì tiêu chuẩn họ sử dụng mặc dù, trong C + + 11, điều này đã được một chút xấu xí hơn và tôi không chắc chắn làm thế nào để làm điều đó trong C + + 03.) –

+0

@onqtam nó là công ty của tôi xem truy cập bằng chỉ mục , khi bạn có quyền truy cập theo loại có sẵn, là một mẫu chống hoàn toàn. –

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