Пытаюсь понять, как написать эту функцию:
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()) и т. д.? Я пытался понять код связывания, но его немного сложно уследить, и не похоже, что они написали его с расчетом на проверку.
Точно. Я понимаю, что это довольно странный запрос, но полагаю, что узнаю много нового о внутренностях boost :: bind, если кто-то найдет ответ.
Я думаю, что ваш запрос полностью верен. Некоторое время назад я пробовал то, что вы собираетесь попробовать, но не нашел способа. boost :: bind имеет интерфейс посетителя, который перезвонит вам с типами и значениями параметров (если есть). но я не нашел способа просто получить типы параметров -.-
Чтобы быть более ясным - меня действительно не волнует boost :: bind в этом сценарии. Что меня действительно волнует, так это проверка типов параметров функции. Есть ли другой способ - ускоренный или нет - сделать это? Похоже, что boost :: bind - это просто держатель, а все умения находятся в операторе bind ().





Когда вы обновили свои проблемы в разделах комментариев, вот ответ. Возможно просто получить возвращаемый тип функции:
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 - вроде, я не могу обрабатывать указатели на методы - но я также понял, что, сделав это, у меня есть процессор стека. Я могу продолжать вызывать методы этого оператора для параметров в стеке.
Я не уверен, что понимаю ваши намерения. Вы хотите, чтобы callFromAnyList принимал (1) функцию и (2) список параметров, а затем вызывал эту функцию с этим списком параметров безопасным для типов способом?