2010-06-27 21 views
6

Tôi muốn chức năng tương tự như dưới đây:Phân biệt đối xử giữa typedefs để cùng loại trong C++

typedef int A; 
typedef int B; 


struct foo 
{ 
    foo(A a) { /*specific to type A*/ } 
    foo(B b) { /*specific to type B*/ } 
}; 

tôi sử dụng typedefs trong chương trình của tôi để chỉ sử dụng một cách hợp lý khác nhau của cùng loại. Vì vậy, tôi muốn tạo đối tượng kiểu foo khác nhau cho các typedef khác nhau. Tôi có thể biên dịch điều này trong g + +, nhưng msvc ném một câu nói phù hợp rằng foo (A) đã được định nghĩa khi nó thấy định nghĩa thứ hai foo (B). Tôi nghĩ đến việc sử dụng một danh sách loại và vị trí của một loại trong danh sách để phân biệt đối xử giữa các typedefs và cố gắng sử dụng một tăng :: mpl :: vector:

#include <boost/mpl/vector.hpp > 
#include <boost/mpl/find.hpp> 

typedef int A; 
typedef int B; 


struct foo 
{ 
    typedef boost::mpl::vector<A, B> supported_types; 

    foo(boost::mpl::find<supported_types, A>::type, A a) {} 
    foo(boost::mpl::find<supported_types, B>::type, B b) {} 
}; 

nhưng không may, tìm quá loại bỏ typedef của tôi và chỉ trả về trình lặp cho A trong cả hai trường hợp. Tôi cũng nghĩ về việc xác định một enum và sử dụng nó cho mỗi loại

enum { TYPE_A, TYPE_B }; 
template <int i> struct int2type {}; 

và sử dụng loại int2type này và loại B trong chương trình. Nhưng điều này có vẻ không phù hợp với tôi vì nó dễ bị lỗi. Tôi muốn sử dụng một typelist và làm điều này, để nó là rõ ràng những loại sẽ được hỗ trợ.

Vui lòng cho tôi biết nếu có cách thức chung và có thể mở rộng để thực hiện việc này.

Trả lời

8

A boost strong typedef nên làm những gì bạn đang tìm kiếm.

#include <boost/strong_typedef.hpp> 

BOOST_STRONG_TYPEDEF(int, A); 
BOOST_STRONG_TYPEDEF(int, B); 
+0

Cảm ơn. Chỉ cần những gì tôi đang tìm kiếm. – Venkatesan

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