我举了以下例子来说明我的问题:
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_area
,obtain_selected_list_based_on_height
和obtain_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);
}
但是,我无法使它工作,因为函数指针指向一个类的成员 您对如何使其有效有所了解吗?此外,针对这个问题的任何其他解决方案?
答案 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不同的东西,你仍然可以使用它。
我无法测试它,它编译但我不知道它是否有效,但它应该。