Замена boost::function и boost::bind на шаблоны

Я пытаюсь удалить библиотеки boost из своего кода. У меня нет std::function, и я работаю с С++ 98, а не с С++ 11. Мне все еще нужно хранить вектор простых void Funcs() из разных классов.

Я использую простой шаблон для получения класса и экземпляра функции. Но я хотел бы заменить потребность в boost::function и boost::bind.

class App
{
public:
   App();

   template<class T>
   static void AddLoopFunc(void (T::*func)(), T* instance)
   {
       loop_funcs.push_back(boost::bind(func, instance));
   }

   static std::vector< boost::function<void()> > loop_funcs;
};

добавление функции в цикл

App::AddLoopFunc(&MyClass::Loop, this);

person aquawicket    schedule 30.01.2018    source источник
comment
что такое this? Звонок изнутри MyClass ? Предоставьте минимальный воспроизводимый пример   -  person 463035818_is_not_a_number    schedule 30.01.2018
comment
Да, стандарт C++98 или C++03, извините за путаницу. :)   -  person aquawicket    schedule 30.01.2018
comment
Почему вы хотите удалить библиотеки повышения?   -  person Maxim Egorushkin    schedule 30.01.2018
comment
В итоге вы получите что-то похожее (специализацию) на bind и function. Если ваша проблема не связана с лицензией, которую использует boost, вы можете просто создать производную работу из соответствующей заголовки и используйте их   -  person Caleth    schedule 30.01.2018


Ответы (2)


Давайте сделаем какой-нибудь адаптер стирания типов для функции-члена любого класса с заданной сигнатурой.

struct dummy
{
    void func() {};
};

typedef void (dummy::*dummyfunc)();

template <class Obj>
void adapt_ptr_mem_func_0(void* obj, dummyfunc func)
{
    void (Obj::*realfunc)() = reinterpret_cast<void (Obj::*)()>(func);
    Obj* realobj = reinterpret_cast<Obj*>(obj);
    (realobj->*realfunc)();
}

С помощью this вы можете вызвать функцию указателя на член любого класса. Не безопасным для типов образом, но мы спрячем это за фасадом безопасного для типов магазина через мгновение.

class callback
{
    void (dummy::*func)();
    void* obj;
    void (*adaptor)(void*, void (dummy::*)());
  public:
    template <class Obj>
    callback(Obj* obj, void (Obj::*func)(void)) :
        obj(obj), func(reinterpret_cast<dummyfunc>(func)),
        adaptor(adapt_ptr_mem_func_0<Obj>) {}

    void operator()()
    {
        adaptor(obj, func);
    }
};

Конструктор callback принимает объект obj_ и указатель на функцию-член func_ и создает объект функции со стиранием типов, который при вызове вызывает (obj->*func)().

Тестирование:

struct Moo
{
    int m;
    Moo (int m) : m(m) {};
    void doit() { std::cout << m << "\n"; }
};

int main()
{
    Moo moo(42);
    callback c(&moo, &Moo::doit);
    c();
};
person n. 1.8e9-where's-my-share m.    schedule 30.01.2018

boost::function и boost::bind доступны в C++98, их не нужно заменять.

person Maxim Egorushkin    schedule 30.01.2018
comment
Оператор пытается удалить библиотеки Boost из моего кода. - person user7860670; 30.01.2018