С
template<typename my_class = sig_class_t,
typename my_type = decltype(get_member_type(&my_class::field))>
class Tricky{
my_type it;
public:
my_type get_it();
void set_it(my_type value);
};
Вы передаете &my_class::field
на get_member_type
. &my_class::field
- это указатель на field
член myclass
, поэтому он имеет тип
decltype(my_class::field) myclass::*
или, чтобы вставить в него engli sh, myclass
указатель на тип элемента field
участник. По умолчанию (поскольку он использует sig_class_t
), то есть
int sig_class_t::*
Почему вы передаете это
template <class T, class M> M get_member_type(M T:: *);
M
выводится как int
и T
выводится до sig_class_t
. Затем функция «возвращает» объект типа M
, поэтому decltype(get_member_type(&my_class::field))
разрешается в M
(int
в случае по умолчанию), и именно так my_type
выводится как тип, на который указывает указатель .