вывод типа из указателя функции в качестве аргумента шаблона

Я новичок в шаблонах и у меня проблемы с их использованием. Я отправляю код, для которого я не могу кодировать. Нужна помощь в том, как сделать это произведение

Мне нужно что-то вроде указателя на функцию, передаваемого в качестве аргумента шаблона классу тестера, и экземпляра TClass, передаваемого в качестве параметра конструктору. В конструкторе указатель на функцию будет использоваться для привязки testFunc к переменной-члену класса тестера, которая является указателем на функцию. Затем, пока класс тестера будет уничтожен, будет вызываться testFunc. Невозможно разрешить вычет типа для шаблона

#include <iostream>

using namespace std;

template< class TClass, TClass::*fptr>
class tester
{

    public:
        tester(TClass & testObj, ...) //... refer to the arguments of the test function which is binded
        {
            //bind the function to member fptr variable
        }

        ~tester()
        {
            //call the function which was binded here
        }

    private:
        (TClass::*fp)(...) fp_t;
};

class Specimen
{
    public:
        int testFunc(int a, float b)
        {
            //do something
            return 0;
        }
}

int main()
{
    typedef int (Specimen::*fptr)(int,float);
    Specimen sObj;

    {
        tester<fptr> myTestObj(sObj, 10 , 1.1);
    }
    return 0
}

person kard    schedule 12.11.2013    source источник
comment
Можете ли вы использовать вариативные шаблоны C ++ 11? Можете ли вы использовать функции boost или std lib, которые сделают всю работу за вас?   -  person Guilherme Bernal    schedule 12.11.2013
comment
Я думаю, вы не можете просто использовать TClass::*fptr в качестве аргумента шаблона, так как подпись отсутствует.   -  person Walter    schedule 12.11.2013
comment
@GuilhermeBernal приводит пример с использованием std в ответе.   -  person Walter    schedule 12.11.2013


Ответы (2)


с использованием C ++ 11 std::bind:

#include <functional>
#include <iostream>

class Specimen
{
public:
  int testFunc(int a, float b)
  {
    std::cout << "a=" << a << " b=" << b <<std::endl;
    return 0;
  }
};

int main()
{
  Specimen sObj;
  auto test = std::bind(&Specimen::testFunc, &sObj, 10, 1.1);
  test();
}

Ознакомьтесь с документацией.

person Walter    schedule 12.11.2013

Я смешал std::function и _ 2_, чтобы приблизиться к вашей проблеме:

template<typename F>
class tester
{
    function<F> func;
public:
    template <typename H, typename... Args>
    tester(H &&f, Args&&... args) : func(bind(f, args...))
    {
    }

    ~tester()
    {
        func();
    }
};

class Specimen
{
public:
    int testFunc(int a, float b)
    {
        return a + b;
    }
};

int main()
{
    Specimen sObj;

    tester<int()> myTestObj(&Specimen::testFunc, &sObj, 10 , 1.1);
}

Живой код

person masoud    schedule 12.11.2013