Я пытаюсь понять реализацию std::is_class
. Я скопировал несколько возможных реализаций и скомпилировал их, надеясь выяснить, как они работают. После этого я обнаружил, что все вычисления выполняются во время компиляции (как я должен был выяснить раньше, оглядываясь назад), поэтому gdb не может дать мне больше подробностей о том, что именно происходит.
Вот реализация, которую я изо всех сил пытаюсь понять:
template<class T, T v>
struct integral_constant{
static constexpr T value = v;
typedef T value_type;
typedef integral_constant type;
constexpr operator value_type() const noexcept {
return value;
}
};
namespace detail {
template <class T> char test(int T::*); //this line
struct two{
char c[2];
};
template <class T> two test(...); //this line
}
//Not concerned about the is_union<T> implementation right now
template <class T>
struct is_class : std::integral_constant<bool, sizeof(detail::test<T>(0))==1
&& !std::is_union<T>::value> {};
У меня проблемы с двумя закомментированными строками. Эта первая строка:
template<class T> char test(int T::*);
Что означает T::*
? Кроме того, это не объявление функции? Он выглядит как единое целое, но компилируется без определения тела функции.
Вторая строка, которую я хочу понять:
template<class T> two test(...);
Еще раз, не является ли это объявлением функции без определения тела? Кроме того, что означает многоточие в этом контексте? Я думал, что многоточие в качестве аргумента функции требует один определенный аргумент перед ...
?
Я хотел бы понять, что делает этот код. Я знаю, что могу просто использовать уже реализованные функции из стандартной библиотеки, но я хочу понять, как они работают.
Ссылки: