Giả sử tôi có một lớp học như thế này:Tại sao decltype không được phép trên các biến thành viên riêng tư?
class Foo
{
std::vector<int> bar;
public:
std::vector<int>& get_bar() { return bar; }
};
và sau đó trở đi, tôi muốn khác ở đâu đó biến khác mà có cùng loại như bar
. Điều đó sẽ hợp lý với tôi nếu tôi chỉ có thể làm điều này:
decltype(Foo::bar) clone_of_bar;
Nhưng điều đó không hiệu quả. Trình biên dịch cho tôi biết 'std :: vector < int> Foo :: bar' là riêng tư.
Vì vậy, tôi sẽ chỉ phải sử dụng một cái gì đó như thế này:
std::remove_reference<decltype(std::declval<Foo>().get_bar())>::type clone_of_bar;
Những công trình, nhưng trông giống như một mớ hỗn độn đầy đủ. Có lẽ có một cách dễ dàng hơn để làm điều đó; Tôi không chắc lắm. Nhưng điều tôi thực sự muốn biết là tại sao tôi không thể sử dụng decltype(Foo::bar)
. Tại sao mọi người nên quan tâm rằng bar
là riêng tư? Nó không giống như tôi đang thực sự truy cập vào biến.
decltype
là tính năng mới của ngôn ngữ. Tôi chỉ không hiểu tại sao nó được thiết kế để không hoạt động trên các biến riêng tư.
tôi thực sự sẽ đánh giá cao nếu bạn có thể cung cấp cho chúng tôi một số ** thực tế ví dụ ** trong đó bạn sẽ được hưởng lợi từ việc sử dụng decltype các thành viên tư nhân. – mfontanini
Vâng, tôi có bất kỳ lý do thực sự vững chắc nào để làm điều này. Đó chỉ là sự tò mò. Nhưng trường hợp mà tôi đã cố gắng sử dụng nó là: Tôi đã sử dụng google protobuf, mà tôi định nghĩa một số loại sự kiện và sau đó protobuf tạo ra một số mã cho các loại đó. Mã được tạo ra trông giống như những gì tôi đã viết trong ví dụ câu hỏi của mình. Vấn đề là, tôi muốn có thể sao chép một số dữ liệu ra khỏi tin nhắn protobuf để làm một số công cụ và tôi không muốn phải thay đổi mã nếu tôi xảy ra để thay đổi loại trong thông điệp protobuf. Đó là điều tôi muốn làm. Không thực sự là một việc lớn mặc dù. – karadoc
Bạn không thể chỉ sử dụng "auto x = somefoo.get_bar();" ? Bạn muốn sao chép, không cung cấp rõ ràng loại "x". – mfontanini