При чтении этого вопроса я наткнулся на @Johannes.
template<typename> struct void_ { typedef void type; };
template<typename T, typename = void> // Line 1
struct is_class { static bool const value = false; };
template<typename T>
struct is_class<T, typename void_<int T::*>::type> { // Line 2
static bool const value = true;
};
Эта конструкция находит, если данный тип является классом или нет. Меня озадачивает новый вид синтаксиса для написания этой небольшой метапрограммы. Может кто-нибудь объяснить подробно:
- Почему нам нужна строка 1?
- В чем смысл синтаксиса
<int T::*>
как параметрtemplate
в строке 2?