Альтернатива std :: bind при передаче функции-члена - PullRequest
0 голосов
/ 01 февраля 2019

У меня есть некоторые функции, которые я бы хотел сравнить.Я хотел бы иметь возможность передать их в функцию сравнения.Ранее я передавал указатель функции и ссылку на объект в функцию тестирования, например,

template<typename T>
void (T::*test_fn)(int, int), T& class_obj, )

На данный момент у меня есть это

#include <iostream>
#include <functional>
using namespace std::placeholders;

class aClass
{
public:
    void test(int a, int b)
    {
        std::cout << "aClass fn : " << a + b << "\n";
    }

};

class bClass
{
public:
    void test(int a, int b)
    {
        std::cout << "bClass fn : " << a * b << "\n";
    }

};

// Here I want to perform some tests on the member function
// passed in
class testing
{   
public:
    template<typename T>
    void test_me(T&& fn, int one, int two)
    {
        fn(one, two);
    }
};


int main()
{
   aClass a;
   bClass b;
   auto fn_test1 = std::bind(&aClass::test, a, _1, _2);
   auto fn_test2 = std::bind(&bClass::test, b, _1, _2);

   testing test;

   test.test_me(fn_test1, 1, 2);
   test.test_me(fn_test2, 1, 2);
}

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

1 Ответ

0 голосов
/ 01 февраля 2019

Функция test_me может принимать любой вызываемый объект.Включая лямбды.Никаких изменений не требуется.

Что-то вроде

test.test_me([a](int one, int two) { a.test(one, two); }, 1, 2);
...