c ++ 11 — C ++, сопоставление пользовательских заполнителей с аргументами функции

Я пытаюсь написать кусок кода, который будет делать следующее: предположим, у нас есть вызов пользовательской функции связывания

auto bind_obj = bind(some_func, _1, "test")

и после того, как мы

auto res = bind_obj(42)

где функция some_func:

int some_func(int val, string test)

Как можно сопоставить заполнители с аргументами, указанными в реальном вызове функции, то есть bind_obj (…) ??

Другими словами, возможно ли выполнить итерации по std :: tuple (аргументы и заполнители здесь) и пакету переменных (аргументы функции) для:

  1. вывести возвращаемый тип функции some_func;
  2. сделать правильный std :: tuple для дальнейшего использования его в вызове some_func ()?

Я пытаюсь сделать это, не используя boost и std :: функционал. Я думаю, моя главная проблема заключается в том, что я не понимаю, как создать кортеж во время выполнения с аргументами (где все заполнители заменены правильно) и как определить тип возвращаемого значения.

Я видел структуру шаблона _Mu в STL «functions.h», но она выглядит слишком сложной и перегруженной.

0

Решение

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

  • если связанный элемент является значением, он возвращает значение
  • если связанный элемент является заполнителем, он возвращает аргумент по указанному индексу
  • если связанный элемент является функцией связывания, он возвращает результат оценки этой функции

Предположим, что ваш связанный объект содержит std::tuple<B...> связанных аргументов называется b тогда вы могли бы построить std::tuple<...> аргументов вызова примерно так:

template <typename... A, std::size_t... I>
... bound::call(std::tuple<A...>&& aux, index_list<I...>) {
auto args = std::make_tuple(get_argument<I>(this->b, a));
// ...
}
template <typename... A>
... bound::operator()(A&&... args) {
return this->call(std::tie(std::forward<A>(args)..., make_index_list<sizeof...A>());
}

Этот фрагмент кода просто показывает, как получить согласованные аргументы. Настоящая работа происходит в get_argument<I>(b, a) функции, которые woild просто возвращают элемент a указывается значением заполнителя, если элемент по индексу I в b бывает заполнителем.

Код не содержит сведений о том, как создать список индексов, как определить тип возвращаемого значения после сортировки вызова или как обращаться с аргументами rvalue …

2

Другие решения


По вопросам рекламы [email protected]