Как запустить поток с функцией другого соглашения о вызовах

Ссылаясь на эту публикацию, я есть чистый виртуальный класс:

#define CALL __stdcall
class IIEvent
{
    virtual ~IIEvent() {}

    virtual void CALL ev1(int) = 0;
    virtual void CALL ev2(int) = 0;
};

Этот интерфейс используется для реализации шаблона публикации-подписчика. Библиотека вызывает функцию IIEvent в отдельном потоке.

void generateEvent1( int i )
{
    // mListeners is a std::vector< IIEvent* >
    for ( auto& f : mListeners )
    {
        std::thread t( &IIOEvent::ev1, f, t ) );
        t.detach();
    }
}

Но это дает мне ошибку времени компиляции (в этом случае я использую MinGW): проблема кажется соглашением о вызовах. Если я удаляю соглашение о вызовах, все работает нормально.

Итак, как я могу запустить поток функции с определенным соглашением о вызовах?

Примечание: необходимо соглашение о вызовах, чтобы убедиться, что библиотека работает с другими компиляторами.

Благодаря Кори Нельсону решение может быть:

void generateEvent1( int i )
{
    // mListeners is a std::vector< IIEvent* >
    for ( auto& f : mListeners )
    {
        std::thread t( [f, i] ()
        {
            f->ev1( b );
        });
        t.detach();
    }
}

Но это, кажется, вызывает сбой во время выполнения моего приложения...


person Elvis Dukaj    schedule 30.10.2013    source источник
comment
std::thread принимает функтор. Попробуйте обернуть свою функцию в лямбду.   -  person Cory Nelson    schedule 30.10.2013
comment
Что такое b и t? Они как-то связаны с i?   -  person Igor Tandetnik    schedule 30.10.2013
comment
@IgorTandetnik Я исправил это: std::thread t( [&f, i] () где i - это параметр ev1.   -  person Elvis Dukaj    schedule 30.10.2013