Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/134.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ C++;指向成员函数的指针,成员_C++_Function_Pointers_Member - Fatal编程技术网

C++ C++;指向成员函数的指针,成员

C++ C++;指向成员函数的指针,成员,c++,function,pointers,member,C++,Function,Pointers,Member,我想要一个指向成员函数的指针。然后我可以将这个指针设置为指向其他成员函数之一,并使用它调用我真正想要的函数。本质上,我有不同的方法来实现一个函数,我想设置一个指针来调用相应的函数。该类也是一个模板类 我找不到通过函数指针调用函数的方法。 例如: template <typename T> class C { public: typedef void(C<T>::*Cfunc)(int); Cfunc cf; void p1(int i) {

我想要一个指向成员函数的指针。然后我可以将这个指针设置为指向其他成员函数之一,并使用它调用我真正想要的函数。本质上,我有不同的方法来实现一个函数,我想设置一个指针来调用相应的函数。该类也是一个模板类

我找不到通过函数指针调用函数的方法。 例如:

template <typename T> class C
{
public:
    typedef void(C<T>::*Cfunc)(int);
    Cfunc cf;
    void p1(int i) {
    }
    C (int i)
    {
        cf = &C<T>::p1;
    }
};
int main ()
{
C<int> Try1(1);
(Try1.*C<int>::cf)(10);
 return 0;
}
模板类C
{
公众:
typedef void(C::*Cfunc)(int);
Cfunc cf;
无效p1(内部i){
}
C(国际一)
{
cf=&C::p1;
}
};
int main()
{
C Try1(1);
(Try1.*C::cf)(10);
返回0;
}
我得到一个错误:

tc.cpp: In function ‘int main()’:
tc.cpp:5:11: error: invalid use of non-static data member ‘C<int>::cf’
     Cfunc cf;
           ^
tc.cpp:16:16: error: from this location
 (Try1.*C<int>::cf)(10);
tc.cpp:在函数“int main()”中:
tc.cpp:5:11:错误:非静态数据成员“C::cf”的使用无效
Cfunc cf;
^
tc.cpp:16:16:错误:来自此位置
(Try1.*C::cf)(10);

您指向成员函数的指针不是静态变量,因此您需要一个
C
实例来访问它

int main()
{
  C<int> Try1(1);
  (Try1.*Try1.cf)(10);
  return 0;
}
intmain()
{
C Try1(1);
(Try1.*Try1.cf)(10);
返回0;
}

您真的需要指向成员变量的指针吗?在std::function和lambdas之间几乎没有任何需要。我不知道如何解决std::function或lambdas的问题。我想要的是能够在构建时设置我想要使用的实现集。我可能还希望能够在对象的生命周期中通过更改指针来动态地更改它。因此,在我的示例中,有时cf指向p1,有时它指向实现p2。我不想在通话时有一个if-then-else的麻烦或开销。太好了。谢谢我不明白我必须有两次Try1。@KevinD您可以通过在C中声明
void wrap(){return(this->*cf)(10);}
来避免两次
Try1
。关键是您使用Try1两次-一次是为了获得ptmf,一次是为了调用函数。(在一般情况下,这些对象往往不相同)。