Rokiのチラ裏

学生による学習のログ

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);
}
参照