【问题标题】:Understanding about templates and function pointer了解模板和函数指针
【发布时间】:2017-12-07 12:59:22
【问题描述】:

我想知道为什么要把 fun1() 设为静态成员函数?模板中的函数指针?在下面的代码中。

#include<iostream>
using namespace std;
class A
{
    int temp;
    public:
    A():temp(1){}
    template<class T, void (*fn)(T* )>
    static void create(T *ptr)
    {
        cout <<"create fn"<<endl;
        //fun1(ptr);
    }
    static void fun1(A* tp) 
    {
         cout<<"func temp"<<endl;
    }
    static void fun2(A& ob)
    {
        cout<<"fun2 start"<<endl;
        A::create<A,&A::fun1>(&ob);
        cout<<"fun2 end"<<endl;
    }
};
int main()
{
    A ob,ob1;
    ob.fun2(ob1);
}

【问题讨论】:

标签: c++ templates function-pointers static-methods


【解决方案1】:

类的静态函数成员只是类命名空间中的常规函数​​:

类的静态成员不与类的对象相关联:它们是具有静态存储持续时间的独立对象或在命名空间范围内定义的常规函数​​,在程序中只有一次。

cppreference.com

在您的示例中,A::f1 的类型为void(A*)A::f2 的类型为void(A&amp;)。值得注意的是,静态函数不需要调用实例。

另外,非静态成员函数do 需要调用一个实例。您必须使用pointers to class members。在您的示例中,您将使用&amp;A::f1&amp;A::f2,它们的类型分别为(void)A::*f1(A*)(void)A::*f2(A&amp;)。如果指向成员函数的指针被视为常规函数指针,它们将如何被调用?他们需要一个对象实例来指向 this 指针。

您可以使用 std::bind 将指向成员函数的指针转换为重载 () 运算符并表现得像函数(AKA 仿函数)的对象:

A a;
std::bind(&A::f1, &a); // &a is the value of this

但是,仿函数与函数指针的类型不同。我建议在 functional 头文件中使用 std::function 而不是函数指针,因为它们可以容纳函子。

(有关详细信息,请参阅http://en.cppreference.com/w/cpp/language/pointer。)

【讨论】:

  • std::bind 不会创建函数指针,它会创建一个可以像函数一样调用的类类型的对象。此外,lambda 在几个方面都优于 std::bind
  • 嗯,谢谢你告诉我。但是,lambdas 不也返回函子吗?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多