通过operator()调用类模板成员函数指针

时间:2018-12-16 02:37:16

标签: c++ member-function-pointers class-template

我有一组课程;一个是模板,并接受其他两个类作为其模板参数。类模板具有一个函数指针成员,该成员将指向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;    
}

到目前为止,它可以编译,但是看起来输出显示的是函数指针的地址,而不是值...

-输出-

// 1st Run
20326695
20326703

// 2nd Run
2304295
2304303

// 3rd Run
1780007
1780015

我知道要获得实际值,我必须服从某些东西,但是由于类成员函数指针的语法有点晦涩难懂,所以我不知道需要遵从什么,也不知道正确的语法...我想感谢任何帮助!

1 个答案:

答案 0 :(得分:1)

User在评论中提供了我所缺少的内容。它与成员函数指针的语法无关,也与如何调用或引用它们以获取正确值无关。

这是我忽略或错过的简单事情。问题出在我的类模板的构造函数中。我传递值而不是引用,因此得到UB。它正在复制本地副本的地址,并将其保存到成员指针中。要修复上述代码,只需更改以下内容即可:

我不得不更改它:

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

对此:

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

现在一切正常,我得到了正确的结果。