Не удалось творчески сократить название :)Как передать, а затем вызвать общие функции обратного вызова, не вызывая циклическую зависимость
Я использую вариацию ниже решения, однако я всегда задавался вопросом, есть ли лучше/более чистый способ его реализации. Я ищу небуксовое решение. Тем не менее, мы можем взглянуть на реализацию boost и C++ 0x, поскольку это скоро будет актуальным.
//Notice the use of template template parameter
template <template <typename> class Callback>
class A {
Callback <A> m_func;
public:
A (Callback <A> func): m_func (func) {}
void call() { m_func(*this);}
};
template <typename T>
struct MYCallback
{
void operator() (const T&t) {}
};
void Test()
{
typedef A<MYCallback> AType;
MYCallback<AType> callback;
AType a (callback);
a.call();
}
Другой, более suncinct способом, является использование tr1 :: функцию, которая станет defuct к новой стандартизации:
#include <tr1/functional>
class A {
std::tr1::function <void (const A&)> m_func;
public:
template <class Callback>
A (Callback func) : m_func (func) {}
void call() { m_func(*this);}
};
template <class T>
struct My_callback
{
void operator() (const T&t) {}
};
void Test()
{
My_callback <A> c;
A a (c);
a.call();
}
Простите, я не совсем понимаю смысл вашего кода. Почему бы не увеличить :: bind и boost :: function делать то, что вы хотите? Это кажется смехотворным сложным - я должен упустить что-то мощное, что это позволяет вам делать. –
Я понятия не имею, каков ваш реальный вопрос. можете ли вы перефразировать то, что вы хотите достичь? –