Передача boost :: any к результатам boost :: bind - PullRequest
1 голос
/ 20 ноября 2008

Я пытаюсь выяснить, как написать эту функцию:

template <typename Bound>
Bound::result_type callFromAnyList(Bound b, list<any> p)
{
}

Тогда, если бы у меня была какая-то функция:

double myFunc(string s, int i)
{
    return -3.0;
}

Я мог бы назвать это, сделав что-то вроде этого:

list<any> p;
p.push_back((string)"Hello");
p.push_back(7);
double result = callFromAnyList(bind(myFunc, _1, _2), p);

Можно ли написать что-то вроде моей callFromAnyList функции? Можете ли вы проверить тип результата и типы параметров из типа, возвращенного из bind? А потом позвонить any_cast<P1>(*p.begin()) и т.д? Я пытался понять код связывания, но за ним немного трудно следовать, и не похоже, что они написали его с мыслью.

Ответы [ 2 ]

1 голос
/ 20 ноября 2008

Как вы обновили свои проблемы в разделах комментариев, здесь ответ. Возможно просто получить тип возврата функции:

template<typename>
struct return_of;

template<typename R>
struct return_of<R(*)()> {
    typedef R type;
};

template<typename R, typename P1>
struct return_of<R(*)(P1)> {
    typedef R type;
    typedef P1 parameter_1;
};

void foo(int);

template<typename Func>
typename return_of<Func>::parameter_1 bar(Func f) {
    return 42;
}

// call: bar(foo);

Полагаю, вы видите, к чему это приводит :) Вы можете использовать типы функций повышения, которые уже решили это: http://www.boost.org/doc/libs/1_37_0/libs/function_types/doc/html/index.html

0 голосов
/ 21 ноября 2008

Я закончил делать это сейчас -

void invoke(void (f)(), list<any>& params)
{
    f();
}

template <typename R>
void invoke(R (f)(), list<any>& params)
{
    params.push_front(f());
}

template <typename T0>
void invoke(void (f)(T0), list<any>& params)
{
    T0 t0 = any_cast<T0>(*params.begin()); params.pop_front();
    f(t0);
}

template <typename R, typename T0>
void invoke(R (f)(T0), list<any>& params)
{
    T0 t0 = any_cast<T0>(*params.begin()); params.pop_front();
    params.push_front(f(t0));
}

template <typename T0, typename T1>
void invoke(void (f)(T0, T1), list<any>& params)
{
    T0 t0 = any_cast<T0>(*params.begin()); params.pop_front();
    T1 t1 = any_cast<T1>(*params.begin()); params.pop_front();
    f(t0, t1);
}

template <typename R, typename T0, typename T1>
void invoke(R (f)(T0, T1), list<any>& params)
{
    T0 t0 = any_cast<T0>(*params.begin()); params.pop_front();
    T1 t1 = any_cast<T1>(*params.begin()); params.pop_front();
    params.push_front(f(t0, t1));
}

template <typename T0, typename T1, typename T2>
void invoke(void (f)(T0, T1, T2), list<any>& params)
{
    T0 t0 = any_cast<T0>(*params.begin()); params.pop_front();
    T1 t1 = any_cast<T1>(*params.begin()); params.pop_front();
    T2 t2 = any_cast<T2>(*params.begin()); params.pop_front();
    f(t0, t1, t2);
}

template <typename R, typename T0, typename T1, typename T2>
void invoke(R (f)(T0, T1, T2), list<any>& params)
{
    T0 t0 = any_cast<T0>(*params.begin()); params.pop_front();
    T1 t1 = any_cast<T1>(*params.begin()); params.pop_front();
    T2 t2 = any_cast<T2>(*params.begin()); params.pop_front();
    params.push_front(f(t0, t1, t2));
}

Мне не хватает полной мощности boost :: bind - я не могу обрабатывать указатели на методы - но я также понял, что благодаря этому у меня есть процессор стека Я могу продолжать вызывать методы этого оператора для параметров в стеке.

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