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

Нов съм в шаблоните и имам малък проблем с използването им. Публикувам кода по-долу, за който не мога да кодирам. Нуждаете се от помощ как да направите това парче

Имам нужда от нещо като указател на функция, който да бъде предаден като аргумент на шаблона към класа на тестера, а екземплярът на 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 и std::bind, за да се доближите до проблема си:

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