Проблема заключается в несовпадении указателей:
Foo<Bar1, &Bar1::y>
^
При взятии адреса Bar1::y
получается указатель следующего типа:
int(Bar1::*)[42];
, т.е. указатель намассив размером 42, а не указатель на int.Приведение указателя работает:
Foo<Bar1, reinterpret_cast<int* Bar1::*>(&Bar1::y)> foo3(&b1);
, однако value
(тип int) и container->*SomeMember
(указатель типа на int) по-прежнему несовместимы, поэтому вам нужно либо изменить тип value
или разыменуйте указатель:
value = *(container->*SomeMember);
// ^ (!)
Конечно, reinterpret_cast
s всегда вонючий, но при разыменовании указателя получается int, который является исходным типом рассматриваемых данных, поэтому на этот раз,приведение не должно нарушать строгие правила псевдонимов, и мы должны были избегать неопределенного поведения (см. также этот вопрос , допущен, помечен тегом C, но обычно C и C ++ совместимы в этом конкретном вопросе).