我如何用功能指针简化C 功能来为类成员函数

How can I simplify C++ functions with function pointers to class member functions?

本文关键字:功能 成员 函数 何用 指针      更新时间:2023-10-16

我给出以下示例以说明我的问题:

class Abc
{
public:
  int height();
  int width();
  int area();
};
typedef std::vector<class Abc> AbcArray;
void obtain_selected_list_based_on_area(AbcArray& objArray, 
    std::vector<int> &listIndexArray)
{
   std::vector<int> areaArray;
   for(int i=0; i<objArray.size(); i++)
            areaArray.push_back(objArray[i].area());
   function_select_list(areaArray,listIndexArray);
}
void obtain_selected_list_based_on_height(AbcArray& objArray, 
    std::vector<int> &listIndexArray)
{
   std::vector<int> areaArray;
   for(int i=0; i<objArray.size(); i++)
            areaArray.push_back(objArray[i].height());
   function_select_list(areaArray,listIndexArray);
}
void obtain_selected_list_based_on_width(AbcArray& objArray, 
    std::vector<int> &listIndexArray)
{
   std::vector<int> areaArray;
   for(int i=0; i<objArray.size(); i++)
            areaArray.push_back(objArray[i].width());
   function_select_list(areaArray,listIndexArray);
}

您可以从上面的代码段中看到,我们决定根据三个不同的标准选择列表。为此,我们必须编写三个功能:obtain_selected_list_based_on_areaobtain_selected_list_based_on_heightobtain_selected_list_based_on_width
我只是想知道如何简化它。
对我来说,有一种解决方案。一种是使用功能指针:

void obtain_select_list(AbcArray& objArray, std::vector<int> &listSel, FUN fun)
{
    std::vector<int> areaArray;
       for(int i=0; i<objArray.size(); i++)
                areaArray.push_back(objArray[i].width());
       function_select_list(areaArray,listIndexArray);
}

但是,我无法使它起作用,因为功能指针指向了类的成员。
您对如何使其起作用有一些想法吗?此外,还有其他解决此问题的解决方案吗?

不是完全功能指针,而是类方法指针。

此外,使用C 11范围迭代使结果语法更简单,并且更易于阅读:

void obtain_selected_list_based_on(AbcArray& objArray, 
    std::vector<int> &listIndexArray,
    int (Abc::*get_something)())
)
{
   std::vector<int> areaArray;
   for (const auto &v:objArray)
            areaArray.push_back((v.*get_something)());
   function_select_list(areaArray,listIndexArray);
}

这可以被调用为:

obtain_selected_list_based_on(objArray,
                              listIndexArray,
                              &Abc::height);
// or
obtain_selected_list_based_on(objArray,
                              listIndexArray,
                              &Abc::width);
// or
obtain_selected_list_based_on(objArray,
                              listIndexArray,
                              &Abc::area);

您的类方法可能是const本身,将参数类型更改为int (Abc::*get_something)() const

我认为这样的事情应该起作用。

void <template T> obtain_select_list(AbcArray& objArray, std::vector<int> &listSel, T (*fun)(const Abc&))
{
    std::vector<T> areaArray;
       for(int i=0; i<objArray.size(); i++)
                areaArray.push_back(fun(objArray[i]));
       function_select_list(areaArray,listIndexArray);
}

为了更一般,我使用了模板一个,因此,如果您需要该功能返回与int不同的事物,则仍然可以使用它。

我无法测试它,它编译了,但我不知道是否有效,但应该。