如何使用类成员函数的函数指针简化C ++函数?

时间:2016-12-16 20:53:07

标签: c++

我举了以下例子来说明我的问题:

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);

}

但是,我无法使它工作,因为函数指针指向一个类的成员 您对如何使其有效有所了解吗?此外,针对这个问题的任何其他解决方案?

2 个答案:

答案 0 :(得分:2)

不完全是函数指针,而是类方法指针。

此外,使用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

答案 1 :(得分:0)

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

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不同的东西,你仍然可以使用它。

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