Вы можете использовать это, а затем позволить всем владельцам наследовать от Владелец .
Затем вы можете использовать класс Владелец , чтобы конфиденциально обернуть методы, используемые в available_member .
available_member теперь доступно для Владелец . Friend не наследуется, поэтому вы можете предоставить (обернуть) необходимые методы, чтобы все классы, наследующие Owner, могли использовать available_member .
Это двухуровневое решение, но оно поддерживает уровень инкапсуляции.
template < typename U >
struct Owner
{
protected:
accessible_member<U> newAccessible_member() { return accessible_member<U>(); }
accessible_member<U> newAccessible_member(U const& u) { return accessible_member<U>(u); }
.....
};
template < typename T >
struct accessible_member
{
private:
accessible_member() : val(T()) {}
accessible_member(T const& t) : val(t) {}
operator T& () { return val; }
operator T const& () const { return val; }
member_ptr<T> operator & () { return member_ptr<T>(val); }
template < typename U> friend class Owner;
};
Затем вы можете косвенно использовать available_member в структурах, которые наследуются от Owner с использованием защищенных методов:
struct Blah: Owner<int>
{
void Dosomething() {
accessible_member<int> blah= newAccessible_member();
}
};
Посмотрите на последний пример на Шаблон друзей .