Basierend auf dem folgenden answer ein aktuellen question nennen zu funktionieren, ich bin in der Lage einen Funktionszeiger zu verwenden, um die private Methode Foo<T>::foo()
von einer anderen Klasse zu nennen Bar
, wie unten dargestellt (siehe auch ideone)Able Zeiger verwenden private Methode einer externen Klasse
#include <iostream>
template<typename T>
struct Bar
{
typedef void (T::*F)();
Bar(T& t_ , F f) : t(t_) , func(f)
{
}
void operator()()
{
(t.*func)();
}
F func;
T& t;
};
template<typename T>
class Foo
{
private:
void foo()
{
std::cout << "Foo<T>::foo()" << std::endl;
}
public:
Foo() : bar(*this , &Foo::foo)
{
bar();
}
Bar<Foo<T> > bar;
};
int main()
{
Foo<int> foo;
}
Dies funktioniert auf MSVC 2013 und GCC 4.8.3. Ist es gültig?
Sicher, warum sollte es nicht sein? Der Zugriff wurde überprüft, als der Zeiger zugewiesen wurde. – Deduplicator
Das ist wirklich nicht anders als öffentlich zu werden: void buz() {foo(); } ' –