C ++ CRTP: Как сделать только одну (некоторую) функцию базового класса дружественной для производного класса? - PullRequest
0 голосов
/ 09 ноября 2018

Я бы хотел, чтобы ТОЛЬКО Base<DerivedImpl>::fct1() имел доступ к членам класса DerivedImpl.

База выглядит так:

template < typename Derived>
class Base<Derived>{

protected:
void fct1(){
static_cast<Derived*>(this)->topfunc();
}

void fct2(){
...
}

};

Производный класс выглядит так:

class DerivedImpl: public Base<DerivedImpl>{

void callbase(){fct1();}
void topfunc(){std::cout << "topfunc" <<std::endl;}

friend Base<DerivedImpl>; //this works
//friend void Base<DerivedImpl>::fct1(); //does not work!!
};

Main c ++:

int main(){
DerivedImpl obj;
obj.callbase();
}

1 Ответ

0 голосов
/ 10 ноября 2018

Отказ от ответственности: Это отвечает на вопрос в том виде, в котором оно было задано, но, на мой взгляд, предпочтительнее использовать другой подход к проектированию, поэтому я не рекомендую делать это на производстве, если только вам это не нужно.

Вы можете обойти это, злоупотребляя тем фактом, что производным классам разрешен доступ к protected статическим членам их родительских классов:

#include <iostream>

template<typename Derived>
class Base {
protected:
  static void fct1(Base* self){
    static_cast<Derived*>(self)->topfunc();
  }

  void fct2() {}
};

class DerivedImpl: public Base<DerivedImpl> {

  void callbase() { fct1(this); }
  void topfunc() { std::cout << "topfunc" << std::endl; }

  friend void Base<DerivedImpl>::fct1(Base*); // works fine now!
};
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...