C++ 通过运算符()调用类模板成员函数指针
我有一套课程;一个是template,并接受其他两个类作为其模板参数。类模板有一个函数指针成员,该成员将指向C++ 通过运算符()调用类模板成员函数指针,c++,member-function-pointers,class-template,C++,Member Function Pointers,Class Template,我有一套课程;一个是template,并接受其他两个类作为其模板参数。类模板有一个函数指针成员,该成员将指向T类的函数。我试图通过类的操作符()()调用函数调用 到目前为止,我的代码是这样的: template<class T> class A { private: T* ptrT{ nullptr }; public: explicit A( T t ) : ptrT( &t ) {} void(T::*func)(); void ope
T
类的函数。我试图通过类的操作符()()
调用函数调用
到目前为止,我的代码是这样的:
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;
}
我知道要获得实际值,我必须遵从一些东西,但由于类成员函数指针的语法有点模糊,我不知道需要遵从什么,也不知道正确的语法。。。我将感谢任何帮助 在评论中提供了我缺少的东西。它与成员函数指针的语法无关,也与如何调用或遵从它们以获得正确的值无关
这是一件我忽略或错过的简单事情。问题或问题出现在我的类模板的构造函数中。我传递的是值而不是引用,因此得到的是UB
。它正在复制本地副本的地址并将其保存到成员指针中。修复上述代码所需的全部更改如下:
我必须改变这一点:
explicit A( T t ) : ptrT( &t ) {}
为此:
explicit A( T& t ) : ptrT( &t ) {}
现在一切都按预期进行,我现在得到了正确的结果。在
A
的构造函数中,您的参数T
是按值传递的。您正在获取局部变量的地址并将其保存到ptrT
中。由于未定义的bahavior,您得到的结果是垃圾。我想这是对@user10605163-hmm的打字错误。。。我将尝试通过引用传递,看看这是否有什么区别。@user10605163就是这样做的!我有一种感觉,这是一件我错过或忽略的简单事情。这不是打字错误;我只是没有考虑将本地副本传递到构造函数中,而不是通过引用传递。我更关注成员函数指针语法,而忽略了更简单的东西。
explicit A( T& t ) : ptrT( &t ) {}