Вызов указателя на функцию-член шаблона класса через operator () - PullRequest
0 голосов
/ 16 декабря 2018

У меня есть набор классов;один является шаблоном и принимает два других класса в качестве аргумента шаблона.Шаблон класса имеет член-указатель на функцию, который будет указывать на функцию класса T.Я пытаюсь вызвать вызов функции через класс operator()().

. Вот как мой код выглядит так:

template<class T>
class A {
private:
    T* ptrT{ nullptr };
public:
    explicit A( T t ) : ptrT( &t ) {}

    void(T::*func)();

    void operator()() {
        (ptrT->*func)();
    }    
};

class B {
    int ib{2};
public:
    void func() {
        std::cout << ib << '\n';
    }
};

class C {
    int ic{6};
public:
    void func() {
        std::cout << ic << '\n';
    }
};

int main() {
    try {
        B b;
        C c;
        A<B> a1( b );
        A<C> a2( c );
        a1.func = &B::func;
        a2.func = &C::func;

        a1();
        a2();   

    } catch( std::runtime_error& e ) {
        std::cerr << e.what() << std::endl;
        return EXIT_FAILURE;
    }
    return EXIT_SUCCESS;    
}

Пока что это компилируется, однако кажется, чтона выходе отображается адрес указателя функции, а не значения ...

-Output-

// 1st Run
20326695
20326703

// 2nd Run
2304295
2304303

// 3rd Run
1780007
1780015

Я знаю, что для получения фактического значения IЯ должен что-то почтить, но из-за того, что синтаксис указателей на функции-члены класса немного неясен, я не знаю, что нужно защищать, ни правильный синтаксис ... Я был бы признателен за любую помощь!

1 Ответ

0 голосов
/ 16 декабря 2018

Пользователь предоставил в комментариях то, что мне не хватало.Это не имело никакого отношения к синтаксису указателей на функции-члены, ни к тому, как вызывать или вызывать их, чтобы получить правильные значения.

Это было что-то простое, что я пропустил или пропустил.Проблема или проблема были в конструкторе шаблона моего класса.Я передавал по значению вместо ссылки, и поэтому получал UB.Он копировал адрес локальной копии и сохранял его в указателе члена.Все, что нужно было изменить, чтобы исправить приведенный выше код, было так:

Мне пришлось изменить это:

explicit A( T t ) : ptrT( &t ) {}

на это:

explicit A( T& t ) : ptrT( &t ) {}

И теперь всеработает как положено, и теперь я получаю правильные результаты.

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