我有一组课程;一个是模板,并接受其他两个类作为其模板参数。类模板具有一个函数指针成员,该成员将指向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
我知道要获得实际值,我必须服从某些东西,但是由于类成员函数指针的语法有点晦涩难懂,所以我不知道需要遵从什么,也不知道正确的语法...我想感谢任何帮助!
答案 0 :(得分:1)
User在评论中提供了我所缺少的内容。它与成员函数指针的语法无关,也与如何调用或引用它们以获取正确值无关。
这是我忽略或错过的简单事情。问题出在我的类模板的构造函数中。我传递值而不是引用,因此得到UB
。它正在复制本地副本的地址,并将其保存到成员指针中。要修复上述代码,只需更改以下内容即可:
我不得不更改它:
explicit A( T t ) : ptrT( &t ) {}
对此:
explicit A( T& t ) : ptrT( &t ) {}
现在一切正常,我得到了正确的结果。