2013-06-04 28 views
13

Tôi cần phải thực hiện chức năng biên dịch tự phục vụ để kiểm tra tính bình đẳng loại (mẫu chức năng không có đối số bool eqTypes<T,S>()).chức năng biên dịch thời gian để kiểm tra mức độ bình đẳng

phương tiện tự chứa không dựa vào thư viện.

Tôi không giỏi trong tất cả điều này. Đó là những gì tôi đã thử, nhưng đó không phải là những gì tôi cần.

template<typename T> 
bool eq_types(T const&, T const&) { 
return true; 
} 

template<typename T, typename U> 
bool eq_types(T const&, U const&) { 
return false; 
} 
+2

Bạn có được phép sử dụng ['std :: is_same'] (http://en.cppreference.com/w/cpp/types/is_same) không? – juanchopanza

+0

http://stackoverflow.com/a/3450395/168175 cho thấy làm thế nào để thực hiện nó cho mình, nhưng nó sẽ cần (tầm thường) thích ứng để được một chức năng thay vì một cấu trúc. – Flexo

Trả lời

23

Nó khá đơn giản. Chỉ cần xác định loại đặc điểm và chức năng trợ giúp:

template<typename T, typename U> 
struct is_same 
{ 
    static const bool value = false; 
}; 

template<typename T> 
struct is_same<T, T> 
{ 
    static const bool value = true; 
}; 

template<typename T, typename U> 
bool eqTypes() { return is_same<T, U>::value; } 

Đây là live example.

Trong C++ 11, nếu bạn được phép sử dụng std::false_typestd::true_type, bạn sẽ viết lại trên theo cách này:

#include <type_traits> 

template<typename T, typename U> 
struct is_same : std::false_type { }; 

template<typename T> 
struct is_same<T, T> : std::true_type { }; 

template<typename T, typename U> 
constexpr bool eqTypes() { return is_same<T, U>::value; } 

Thông báo, rằng các loại đặc điểm std::is_same, mà hiện khá nhiều điều tương tự , có sẵn như là một phần của Thư viện chuẩn.

+0

Nó không hoạt động cho đa hình. –

+0

Cũng có thể 'constexpr bool eqTypes()'. –

+0

@TimothyShields: Đúng vậy, tôi giả sử C++ 03 là mục tiêu. Tôi sẽ thêm một phiên bản C++ 11-ish –

2

Đây là cách bạn có thể làm điều đó trong C, mà không cần bất kỳ phần mở rộng GCC kỳ diệu:

#define CHECKED_TYPE(original_type, p) ((conversion_type*) (1 ? p : (original_type*) 0)) 

ví dụ:

void *q = CHECKED_TYPE(int, &y); 

sẽ kích hoạt một lỗi biên dịch nếu y không phải là int.
Để được giải thích, hãy xem here.

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