Как передать делегат делегату, который ожидает указатель на управляемую функцию в управляемом C ++ - PullRequest
2 голосов
/ 24 октября 2011

У меня есть следующий звонок:

ExecutionContext::Run(item->Context, gcnew ContextCallback(item, &WaitQueueItem::Callback), item->State);

где WaitQueueItem следующее:

ref class WaitQueueItem
{
public:
    WaitQueueItem(){}

    WaitCallback^ Callback;
    Object^ State;
    ExecutionContext^ Context;
};

WaitCallback определяется как public delegate void WaitCallback(Object^ state) в пространстве имен System::Threading.

Компиляция выдает следующую ошибку:

ошибка C2843: 'Foo :: Bar :: Data :: ConistingClass :: WaitQueueItem :: Callback': невозможно взять адрес нестатического члена данных или метод управляемого тип

Если я предоставлю функцию с той же сигнатурой, что и у делегата WaitCallback, она скомпилируется. Копаясь с dotPeek, я вижу, что тот же код при написании на C #

ExecutionContext.Run(item.Context, new ContextCallback(item.Callback), item.State);

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

ExecutionContext.Run(item.Context, new ContextCallback(item.Callback.Invoke), item.State);

Есть ли способ передать делегат без необходимости писать функцию-обертку?

Заранее спасибо

1 Ответ

0 голосов
/ 04 июня 2012

Возможно, вы хотите

gcnew ContextCallback(item->Callback, &WaitCallback::Invoke)

(что эквивалентно тому, что сделал компилятор C #, привязывая экземпляр объекта item->Callback и его Invoke метод)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...