2010-06-09 41 views
5

Tôi chắc chắn rằng tăng cường có một số chức năng để thực hiện việc này, nhưng tôi không biết các thư viện có liên quan cũng đủ. Tôi có một lớp mẫu, đó là khá cơ bản, ngoại trừ một twist, nơi tôi cần phải xác định một loại có điều kiện. Đây là mã psuedo cho những gì tôi muốnĐịnh nghĩa kiểu có điều kiện

struct PlaceHolder {}; 
    template <typename T> 
class C{ 
    typedef (T == PlaceHolder ? void : T) usefulType; 
}; 

Làm cách nào để viết loại đó có điều kiện?

+0

Thú vị. Trong hoàn cảnh nào thì điều này sẽ hữu ích? Bạn có thể cung cấp một ví dụ. – Stephen

+0

Đây là ví dụ của tôi. Đối với một đối số mẫu, nói TYPE, có giá trị PlaceHolder có nghĩa là "tắt một số tính năng". Có một tập hợp các callback có kiểu trả về TYPE * rằng ý nghĩa tự nhiên của việc tắt tính năng này là cho các callback có kiểu trả về void. usefulType là giá trị trả về cho các cuộc gọi lại. –

+0

@pythonicmetaphor bạn có thể vui lòng thay đổi câu trả lời được chấp nhận không? Giờ đã khác. – Ven

Trả lời

8

Ngoài ra với những tiêu chuẩn mới:

typedef typename std::conditional<std::is_same<T, PlaceHolder>::value, void, T>::type usefulType

+1

Điều này phải là asnwer được chấp nhận. –

2
template < typename T > 
struct my_mfun : boost::mpl::if_ 
< 
    boost::is_same<T,PlaceHolder> 
, void 
, T 
> {}; 

template < typename T > 
struct C { typedef typename my_mfun<T>::type usefulType; }; 
+0

Mã phải được bắt đầu bằng 4 dấu cách. Bạn có thể chọn văn bản và nhấp vào nút 101010 để thực hiện hàng loạt. – GManNickG

+0

Xin cảm ơn, nhưng xin đừng thay đổi câu trả lời của tôi. –

+7

Xem Câu hỏi thường gặp: "Nếu bạn không hài lòng với ý tưởng về câu hỏi và câu trả lời của bạn đang được người dùng đáng tin cậy chỉnh sửa, đây có thể không phải là trang web dành cho bạn". – Bill

6

Tôi nghĩ rằng đây là nguyên tắc bạn đang sau:

template< class T > 
struct DefineMyTpe 
{ 
    typedef T usefulType; 
}; 

template<> 
struct DefineMyType<PlaceHolder> 
{ 
    typedef void usefulType; 
}; 

template< class T > 
class C 
{ 
    typedef typename DefineMyType<T>::usefulType usefulType; 
}; 
+1

Đây không phải là câu trả lời được chấp nhận trong năm 2015. – Ven

+1

Nó không nên, nhưng tôi không thể thay đổi nó .. Chỉ cần upvote một bằng cách sử dụng std :: có điều kiện, bất kỳ người dùng SO có thể sẽ đủ thông minh để xem xét câu trả lời upvoted nhất. – stijn

+1

Vui lòng thêm "xem câu trả lời sau bằng @rafak" hoặc nội dung nào đó để mọi người biết tìm kiếm trả trước. – Ven

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