void_tを用いたdetection idiom
一年前ぐらいの話題であるが...。void_tというクラステンプレートがある。これは、何をどれだけ渡そうが全て無視してvoidを返すだけのテンプレートである。しかしこれによって、テンプレートパラメータに対して、ある特定のタイプへの有効/非有効的な一式を記述する事ができるようになった。...というのがこのイディオムである。
例えば、以下のコードはiterator_categoryを一式に含める事によってその型がイテレータであるかどうかを判別している。
#include<type_traits> #include<vector> template<class,class=std::void_t<>> struct has_iterator_category:std::false_type{}; template<class _Tp> struct has_iterator_category<_Tp,std::void_t<typename _Tp::iterator_category>>:std::true_type{}; struct X{}; int main() { static_assert(has_iterator_category<std::vector<int>::iterator>::value); static_assert(!has_iterator_category<X>::value); }