Как написать такую шаблонную функцию?

267
28 октября 2017, 17:05

Не пойму как в С++11 написать такую хотелку:

tempalte<class Signature>
struct Object
{
    typedef std::function<Signature> CallbackFunction;
    void registerCallback(const CallbackFunction&);
};
template<class T, ?????>
typedef T::Signature createCallback(T& obj, int id)
{
    void * addr = &obj;
    return [addr, id](??????) { std::cout << addr << id; };
}

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

Пример использования:

Object<void()> obj1;
obj1.registerCallback(createCallback(obj1, 42));
Object<int(A1, A2*, const A3&)> obj2;
obj2.registerCallback(createCallback(obj2, 777));
Answer 1

Например вот так:

#include <iostream>
#include <functional>
#include <memory>
template<typename TSignature> struct
Object
{
    using
    CallbackFunction = ::std::function<TSignature>;
    void
    registerCallback(const CallbackFunction &) {}
};
template<typename TResult> auto
makeResult(void) -> TResult
{
    return(TResult{});
}
template<> auto
makeResult<void>(void) -> void
{
    return;
}
template<typename TSignature> class
t_CallbackWrapper;
template<typename... TArgs, typename TResult> class
t_CallbackWrapper<TResult (TArgs...)> final
{
    private: void * m_p_obj;
    private: int    m_id;
    public: explicit
    t_CallbackWrapper(void * const p_obj, int const id): m_p_obj{p_obj}, m_id{id} {}
    public: auto
    operator ()(TArgs...) const -> TResult
    {
        ::std::cout << m_p_obj << m_id;
        return(makeResult<TResult>());
    }
};
template<typename TSignature> auto
makeCallback(Object<TSignature> & obj, int id) -> typename Object<TSignature>::CallbackFunction
{
    return
    (
        typename Object<TSignature>::CallbackFunction
        {
            t_CallbackWrapper<TSignature>{::std::addressof(obj), id}
        }
    );
}
int main()
{
    Object<void (void)> obj1;
    obj1.registerCallback(makeCallback(obj1, 42));
    Object<int (float, int *, const double &)> obj2;
    obj2.registerCallback(makeCallback(obj2, 777));
    ::std::cout.flush();
    return(0);
}

Запустить в онлайн компиляторе

READ ALSO
Нужен jquery cropping больших картнок

Нужен jquery cropping больших картнок

Подскажите, перерыл пол гугла, нечего не походит, может быть не так понимаюЗадача такая: Есть картинки разных размеров где то около 2000x***-5000x****...

298
Добавление класса с параметром scroll и удаление в зависимости от условия

Добавление класса с параметром scroll и удаление в зависимости от условия

Всем привет! Есть фильтр, задача в зависимости от кол-ва дочерних элементов в блоке, добавлять или удалять css класс, помогите найти ошибку

285
Python scrapy select element with display:none

Python scrapy select element with display:none

Не могу спарсить элемент с значением style="display: none;" css/xpath selector возвращает пустой список

294