2012-01-14 18 views
5

Tôi muốn lưu trữ một tham chiếu đến đối tượng trong đối tượng boost::any. Làm thế nào để khởi tạo boost :: bất kỳ đối tượng nào? Tôi đã thử std::ref(), nhưng boost::any được khởi tạo với std::reference_wrapper<>. Ví dụ, sau đâyLàm cách nào để tôi khởi tạo tăng :: bất kỳ tham chiếu nào đến một đối tượng?

#include <boost/any.hpp> 
#include <cxxabi.h> 
#include <iostream> 

int main(void) 
{ 
    int s; 
    int i = 0; 
    boost::any x(std::ref(i)); 
    std::cout << abi::__cxa_demangle(x.type().name(), 0, 0, &s) << "\n"; 
    return 0; 
} 

in

std::reference_wrapper<int> 

Tôi muốn boost::any chứa int& để thay thế.

+0

Ngoài ra, không có type_info cho loại tham chiếu, thay vào đó type_info cho loại đang được tham chiếu được lấy 'cout << typeid (int) .name() <<" \ t "<< typeid (int &). name() << "\ t" << typeid (int) == typeid (int &) 'tạo' ii 1', vì vậy ngay cả khi bất kỳ đã lưu trữ một tham chiếu, kiểu của nó vẫn sẽ là 'typeid (int)' – stellarpower

Trả lời

3

Lớp boost::any không có giao diện cho phép một cái gì đó như thế này: bạn sẽ cần chỉ định loại tham chiếu với hàm tạo. Tôi không nghĩ rằng bạn có thể chỉ định rõ ràng loại constructor được tạo khuôn mẫu vì tôi không thấy bất kỳ nơi nào bạn có thể dính vào nó. Thậm chí nếu bạn có thể chỉ định rõ ràng tham số mẫu, nó sẽ không hoạt động trong C++ 2003 vì không có tham chiếu sụp đổ có sẵn và tham số được khai báo là lấy T const&: bạn đang cố gắng tạo một T& const& bay. Tôi nghĩ rằng lựa chọn tốt nhất của bạn là sử dụng std::reference_wrapper<T> nếu bạn nhấn mạnh vào thứ gì đó đang tìm kiếm tham chiếu từ xa như hoặc chỉ sử dụng T*.

Điều đó nói chung, nói chung có thể có phương pháp hệ số tĩnh templatized của một loại tương tự như boost::any sẽ được sử dụng để xác định rõ ràng đối số mẫu. Tuy nhiên, kể từ boost::any được thiết kế có chủ ý để xử lý các loại giá trị điều này không được thực hiện. Tôi là một chút đáng ngờ cho dù nó nên được thực hiện là tốt: bằng cách sử dụng một con trỏ là thay thế hoàn toàn tốt. Nếu bạn thực sự cần một kiểu tham chiếu, bạn có thể sẽ phải tự mình thực hiện nó.

3

Hành vi là chính xác, được mong đợi và phù hợp. std::ref là một hàm trợ giúp tạo đối tượng kiểu std::reference_wrapper<T> và trình bao bọc tham chiếu là một lớp có ngữ nghĩa giá trị chứa tham chiếu - đó chính là loại thứ bạn muốn đưa vào vùng chứa nếu bạn muốn vùng chứa theo dõi bên ngoài tài liệu tham khảo.

Vì vậy, chỉ cần đi với giải pháp bạn có.

Nếu bạn muốn, bạn không thể có vùng chứa tài liệu tham khảo trực tiếp, khỏa thân, giống như bạn không thể có một mảng tham chiếu. Các wrapper được thiết kế chính xác để đáp ứng nhu cầu đó.

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