2010-10-20 25 views
7

Tôi đang tìm một lớp meta container/container lai. Tôi muốn một lớp bản đồ một loại thời gian biên dịch thành một giá trị thời gian chạy. Đoạn mã có giá trị 1024 từ để:A std :: map giống như vùng chứa ánh xạ các loại cho các giá trị

struct Foo { /* ... */ }; 
struct Bar { /* ... */ }; 

int main() 
{ 
    meta_container<Foo,float,int> mc; 
    mc.get<float>() = 1.0f; 
    mc.get<Foo>().method(blah); 
    mc.get<Bar>(); //compiler error 
} 

Đây thực sự là công cụ nhàm chán. Việc triển khai sử dụng các mẫu variadic sẽ đủ thú vị nhưng giao diện rất đơn giản.

Phần gây khó khăn hơn cho tính năng cuối cùng này mà tôi muốn.

void foo(const meta_constainer<Foo,Bar,Baz>& mc); 

//make_mc is sorta like make_pair or make_tuple. 

int main() 
{ 
    foo(make_mc(Foo(), Bar(), Baz())); // not really interesting 
    foo(make_mc(Bar(), Foo(), Baz())); // this is more challenging 
    foo(make_mc(Foo())); // this might be difficult as well. 
} 

Tôi có thể viết vùng chứa này, nhưng tôi muốn tìm một vùng chứa đã được viết/sửa lỗi. Chướng ngại vật lớn nhất của tôi đã thiếu từ khóa tốt để tìm kiếm (không đồng nhất chứa không phải là những gì tôi muốn).

Có thư viện Boost nào có giao diện này hoặc giao diện tương tự không?

Điều này được gọi là gì, vì vậy tôi có thể google nó hiệu quả hơn?


update:

Tôi không tìm kiếm:

  • boost::mpl::map
    này bản đồ một giá trị thời gian biên dịch đến một giá trị thời gian biên dịch
  • std::map<*,boost::any>
    này bản đồ một giá trị thời gian chạy kiểu tĩnh thành giá trị thời gian chạy kiểu động
  • std::map<*,boost::variadic<*>>
    này bản đồ một giá trị thời gian chạy gõ tĩnh để một loại giá trị thời gian chạy biến
  • std::map<typeid,boost::variadic<*>>
    này gần với những gì tôi muốn ngoại trừ việc nó sử dụng RTTI và nó không phải là một lỗi biên dịch nếu truy cập với các loại sai.

Trả lời

3
+0

'đẩy mạnh :: fusion :: set' làm nhiều hơn tôi muốn và ít hơn, nhưng nó là tốt nhất tôi đã nhìn thấy cho đến nay. Nó đòi hỏi thứ tự các tham số, vì vậy ví dụ danh sách không sắp xếp của tôi sẽ không hoạt động. –

+0

hmm, tôi đã nghĩ rằng nhiệt hạch: vector là những gì bạn đang tìm kiếm? bạn có thể kết hợp điều đó với một enum để đạt được những gì bạn yêu cầu? – Nim

+0

'fusion :: set' cho phép tôi ánh xạ' int' thành một giá trị số nguyên và 'float' thành giá trị float. 'fusion :: vector' ánh xạ thời gian biên dịch' 0' thành giá trị số nguyên và thời gian biên dịch '1' thành giá trị float. Tôi có thể làm cho một ánh xạ phụ giữa '0',' 1' hằng số và 'int',' float', nhưng 'fusion :: set' làm điều đó cho tôi rồi. –

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