#include template class Param { protected: gig::DimensionRegion* object; public: virtual T& access() = 0; }; template class Param1 : public Param { using Param::object; T gig::DimensionRegion::* param; public: Param1(T gig::DimensionRegion::* param) : param(param) { } T& access(); }; template T& Param1::access() { printf("ojsan"); return object->*param; } class ParamUnityNote : public Param { public: uint8_t& access() { printf("hejsan\n"); return object->UnityNote; } }; int main() { ParamUnityNote p1; Param1 p2(&gig::DimensionRegion::ChannelOffset); Param& pp = p1; printf("%d\n", pp.access()); }