Передача boost :: any в результаты boost :: bind

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

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()) и т. д.? Я пытался понять код связывания, но его немного сложно уследить, и не похоже, что они написали его с расчетом на проверку.

Я не уверен, что понимаю ваши намерения. Вы хотите, чтобы callFromAnyList принимал (1) функцию и (2) список параметров, а затем вызывал эту функцию с этим списком параметров безопасным для типов способом?

Josh Kelley 20.11.2008 22:41

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

Matt Cruikshank 20.11.2008 22:42

Я думаю, что ваш запрос полностью верен. Некоторое время назад я пробовал то, что вы собираетесь попробовать, но не нашел способа. boost :: bind имеет интерфейс посетителя, который перезвонит вам с типами и значениями параметров (если есть). но я не нашел способа просто получить типы параметров -.-

Johannes Schaub - litb 20.11.2008 22:46

Чтобы быть более ясным - меня действительно не волнует boost :: bind в этом сценарии. Что меня действительно волнует, так это проверка типов параметров функции. Есть ли другой способ - ускоренный или нет - сделать это? Похоже, что boost :: bind - это просто держатель, а все умения находятся в операторе bind ().

Matt Cruikshank 20.11.2008 23:07
Стоит ли изучать PHP в 2026-2027 годах?
Стоит ли изучать PHP в 2026-2027 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
1
4
784
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

Ответ принят как подходящий

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

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

Я закончил этим пока -

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 - вроде, я не могу обрабатывать указатели на методы - но я также понял, что, сделав это, у меня есть процессор стека. Я могу продолжать вызывать методы этого оператора для параметров в стеке.

Другие вопросы по теме