Возможно ли иметь обратный вызов для члена класса шаблона? - PullRequest
0 голосов
/ 19 февраля 2019

Возможно ли иметь обратный вызов для члена класса шаблона, как показано выше?Я имею в виду, у меня есть некоторый шаблонный класс, есть определенный объект другого (не шаблонного) класса.Этот объект имеет другую функцию-член.Я хотел бы вызвать из этой функции-члена функцию-член класса шаблона.Это возможно?

Ответы [ 2 ]

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

Вот один из способов сделать это без использования std::function

struct B{ 


    template<class T>
    void CallTemplateFun(void (T::*funPtr)(), T& instance){

        (instance.*funPtr)();
    }


};

template<typename T>
class A{

    T t;
    B b;

public:

    A(T v) : t(v){}

    void print(){ std::cout << t << std::endl  ; }
};

int main(
{

    A<int> ai(5);
    B b;
    b.CallTemplateFun(&A<int>::print, ai);


    A<float> af(3.1428f);
    b.CallTemplateFun(&A<float>::print, af);


    return 0;
}
0 голосов
/ 19 февраля 2019

Вот как я понимаю проблему.Класс с именем 'some_class' (MyAlgorithm) должен иметь ссылку на шаблон (AlgorithmConsumer).Поскольку для 'some_class' требуется только один метод, самый простой способ - передать ссылку на функцию, что-то вроде этого:

#include <iostream>
#include <functional>


class MyAlgorithm
{
    std::function<void()> prepare;
public:
    explicit MyAlgorithm(std::function<void()> prepare)
        : prepare{prepare}
    {}

    void do_something()
    {
        if (prepare)
        {
            prepare();
        }

        std::cout << "I did something\n";
    }
};

template<typename T>
class AlgorithmConsumer
{
    MyAlgorithm algorithm;
public:
    AlgorithmConsumer()
        : algorithm([this](){prepare();})
    {}

    void prepare()
    {
        std::cout << "Preparing...\n";
    }

    void execute()
    {
        algorithm.do_something();
    }
};

int main()
{
    AlgorithmConsumer<int> ac;
    ac.execute();
    return 0;
}

Надеюсь, это решит вашу проблему.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...