Как правильно назвать этот метод? - PullRequest
0 голосов
/ 30 октября 2019

Я пытаюсь понять placeholders, но я не могу вызвать этот метод. У меня есть неявные параметры Dummy{}, float и LastDummy{}. Когда я вызываю функцию, я пропускаю эти параметры. Также мой звонок не работает.

struct AnotherDummy {};
struct YetAnotherDummy {};
struct LastDummy {};

class X { public:
    void foo(std::string one, Dummy two, int three, AnotherDummy four, 
             float five, YetAnotherDummy six, double seven, int eight, LastDummy nine)
    {

    }
};

int main()
{
    using namespace std::placeholders;

    auto functor = std::bind(&X::foo, _6, _3, Dummy{}, _5, _1, 5.0f, _4, _2, _7, LastDummy{});

    X obj;
    functor(&obj, YetAnotherDummy{}, 1, 2.3f, 'x', AnotherDummy{}, Dummy{}, 2.3);

    return 0;
}

1 Ответ

0 голосов
/ 30 октября 2019

Для нестатических функций-членов объект, для которого вызывается функция (что становится указателем this внутри функции-члена), передается как скрытый первый аргумент.

Таким образом, основная проблема с использованиемиз functor означает, что X объект obj должен быть первым аргументом функции, то есть заполнителем _1. Остальные аргументы начинаются с местозаполнителя _2.

Так что вам нужно сделать, например,

auto functor = std::bind(&X::foo, _1, _7, _4, Dummy{}, _6, _2, 5.0f, _5, _3, _8, LastDummy{});

Обратите внимание, что _1 не является первым аргументом функции, а остальные заполнителибыли увеличены на 1.

...