2017-05-28 25 views
9

Tôi muốn kiểm tra xem có chuyên môn mẫu nhất định tồn tại hay không, trong đó trường hợp chung không được xác định.Làm cách nào để quyết định xem chuyên môn mẫu có tồn tại hay không

Given:

template <typename T> struct A; // general definition not defined 
template <> struct A<int> {}; // specialization defined for int 

Tôi muốn xác định một cấu trúc như thế này:

template <typename T> 
struct IsDefined 
{ 
    static const bool value = ???; // true if A<T> exist, false if it does not 
}; 

Có cách nào để làm điều đó (lý tưởng mà không cần C++ 11)?

Cảm ơn

+1

Tại sao bạn sẽ cần phải làm điều này? Yêu cầu tò mò. – HSchmale

+0

@HSchmale, Vấn đề đầy đủ được mô tả ở đây: https://stackoverflow.com/questions/44237528/how-to-write-template-overload-functions-with-fallback-triggered-if-template-arg – Fabio

Trả lời

11

Sử dụng thực tế là bạn không thể áp dụng sizeof đến một loại không đầy đủ:

template <class T, std::size_t = sizeof(T)> 
std::true_type is_complete_impl(T *); 

std::false_type is_complete_impl(...); 

template <class T> 
using is_complete = decltype(is_complete_impl(std::declval<T*>())); 

See it live on Coliru


Đây là một C hơi phiền phức, nhưng làm việC++ 03 giải pháp:

template <class T> 
char is_complete_impl(char (*)[sizeof(T)]); 

template <class> 
char (&is_complete_impl(...))[2]; 

template <class T> 
struct is_complete { 
    enum { value = sizeof(is_complete_impl<T>(0)) == sizeof(char) }; 
}; 

See it live on Coliru

+0

Cảm ơn. Có cách nào để làm điều đó mà không có C++ 11? – Fabio

+0

@Fabio có bạn đến. – Quentin

+0

Cảm ơn! Mẫu trong định nghĩa thứ hai của is_complete_impl có cần trong giải pháp C++ 03 không? – Fabio

0

Đây là một thực hiện thay thế luôn luôn sử dụng các thủ thuật tương tự @Quentin sử dụng


C++ 11 phiên bản

template<class First, std::size_t> 
using first_t = First; 

template<class T> 
struct is_complete_type: std::false_type {}; 

template<class T> 
struct is_complete_type<first_t<T, sizeof(T)>> : std::true_type {}; 

Example on wandbox


Dự kiến ​​C + +03 phiên bản whi ch không hoạt động

template<typename First, std::size_t> 
struct first { typedef First type; }; 

template<typename T> 
struct is_complete_type { static const bool value = false; }; 

template<typename T> 
struct is_complete_type< typename first<T, sizeof(T)>::type > { static const bool value = true; }; 

Các lỗi trong trường hợp này là

prog.cc:11:8: error: template parameters not deducible in partial specialization: struct is_complete_type< typename first::type > { static const bool value = true; }; ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

prog.cc:11:8: note: 'T'

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