2017-05-28 14 views
9

一般的なケースが定義されていない特定のテンプレートの特殊化が存在するかどうかを確認したいと思います。テンプレートの特殊化が存在するかどうかを判断する方法

は考える:

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

私はこのような構造体を定義したいと思います:

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

(理想的には11 C++なし)それをする方法はありますか?あなたが不完全な型にsizeofを適用することができないという事実使い方

おかげ

+1

では動作しませんなぜあなたはこれを行う必要があるでしょうか?好奇心を求める。 – HSchmale

+0

@HSchmale、完全な問題はここに記述されています:https://stackoverflow.com/questions/44237528/how-to-write-template-overload-functions-with-fallback-triggered-if-template-arg – Fabio

答えて

11

:ここ

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


は少し不格好が、作業C++です03溶液:

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++ 11なしでそれを行う方法はありますか? – Fabio

+0

@ファビオそこに行く。 – Quentin

+0

ありがとう! is_complete_implの2番目の定義にあるテンプレートはC++ 03のソリューションに必要ですか? – Fabio

0

これは常に@Quentinが


C++ 11バージョン

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


暫定C +を使用したのと同じトリックを使用して、別の実装であります+03バージョンwhi chが、この場合の

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; }; 

エラーが

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'

関連する問題