tuple
khi tăng và TR1/C++ 0x cung cấp phương thức thuận tiện (cho người viết hàm) trả về hai giá trị từ hàm - tuy nhiên dường như thiệt hại một đặc điểm quan trọng của ngôn ngữ cho người gọi: khả năng chỉ đơn giản là sử dụng chức năng để khởi tạo một biến:Cách khởi tạo với nhiều giá trị trả lại bằng C++ (0x)
T happy();
const auto meaningful_name(happy()); // RVO means no excess copies
nhưng đối với:
tuple<T,U> sad();
chúng tôi hoặc đã từ bỏ các khả năng để chọn một tên có ý nghĩa cho giá trị trả lại của chúng tôi và sử dụng get<n>()
ở khắp mọi nơi:
const auto two_unrelated_things(sad());
hoặc thực hiện một tạm thời:
const auto unwanted_named_temporary(sad());
const auto one_name(get<0>(unwanted_named_temporary));
const auto two_name(get<1>(unwanted_named_temporary));
hoặc chuyển từ khởi sự phân công, mà chỉ hoạt động khi các loại được chuyển nhượng, và phá vỡ auto
:
tuple_element<0, decltype(sad())>::type one_mutable; // there might be a less
tuple_element<1, decltype(sad())>::type two_mutable; // verbose way
tie(one_mutable,two_mutable) = sad();
hoặc làm điều gì đó không tự nhiên với một lớp học địa phương:
const struct ugh {
ugh(decltype(sad()) rhs) : one_name(get<0>(rhs)), two_name(get<1>(rhs)) {}
const tuple_element<0, decltype(sad())>::type one_name;
const tuple_element<1, decltype(sad())>::type two_name;
} stuff(sad()); // at least we avoid the temporary and get initialization
Có cách nào tốt hơn không? Tôi đang sử dụng VC10 tương thích xây dựng ở trên, sẽ bất cứ điều gì trong đầy đủ c + + 0x hoặc tăng giúp đỡ?
Lý tưởng nhất là nó sẽ:
- cho phép tôi sử dụng khởi tạo, không chỉ là nhiệm vụ
- để cho gọi chọn tên cho trở-thành biến
- không làm bản sao thêm
- làm việc cho cả biến ngăn xếp và thành viên lớp học
- có thể là thư viện mẫu lớn, nhưng có cú pháp sane cho người gọi và người viết hàm
Câu hỏi thú vị, mặc dù tôi không thấy cách bạn có thể xác định các biến của các loại khác nhau trong một biểu thức duy nhất. - Tôi nghĩ rằng "hoặc làm cho một tạm thời" tùy chọn có thể là OK, nếu bạn thay đổi các biến được đặt tên thành tài liệu tham khảo (tránh sao chép). – UncleBens
Điểm tốt về tài liệu tham khảo - Tôi nghĩ đó là giải pháp cho các biến ngăn xếp. tôi đã cố gắng làm như vậy trong một lớp học: class C { công cộng: C() sr (buồn()), một (lấy <0> (sr)), hai (được <1> (sr)) {} const T & one; const U & two; riêng tư: tuple sr; Nhưng nó trông giống như trong VC10, C là hai con trỏ lớn hơn tuple, không phải là một thỏa thuận lớn nhưng loại lame - nó sẽ không hợp pháp cho trình biên dịch để nhận ra rằng các tài liệu tham khảo là bí danh và không phân bổ không gian trong trường hợp cho họ? Đó không phải là lý do tại sao con trỏ tham khảo là bất hợp pháp ngay từ đầu? –
BCoates
Với một lớp, nếu dữ liệu được lưu trữ như một bộ dữ liệu, bạn chỉ có thể cung cấp các phương thức accessor có tên, gọi phương thức 'get' tương ứng. Tôi nghi ngờ rằng sẽ có một giải pháp dựa trên "mẫu điên", bởi vì ngôn ngữ cốt lõi đơn giản dường như không hỗ trợ những gì bạn đang yêu cầu. Có lẽ bạn chỉ có thể giảm số lượng ký tự mà bạn phải nhập bằng các macro ... –
UncleBens