我如何用功能指针简化C 功能来为类成员函数
How can I simplify C++ functions with function pointers to class member functions?
我给出以下示例以说明我的问题:
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);
}
但是,我无法使它起作用,因为功能指针指向了类的成员。
您对如何使其起作用有一些想法吗?此外,还有其他解决此问题的解决方案吗?
不是完全功能指针,而是类方法指针。
此外,使用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不同的事物,则仍然可以使用它。
我无法测试它,它编译了,但我不知道是否有效,但应该。
相关文章:
- 类模板的成员功能的定义在单独的TU中完全专业化
- 升压信号2将插槽传递到成员功能以断开连接
- 多次实现成员功能
- 如何定义可变参数类模板的成员模板功能
- 私有成员数据不可用于公共成员功能
- 好友功能 - 成员无法访问
- 如何启用友元类的友元功能直接在C++中访问其私有成员
- 无法从好友功能访问类的私有成员?"ostream"不是"std"的成员?
- C++从成员类型中扣除类型的功能模板?
- 如何避免大多数成员功能相同的代码重复
- 无法访问公共功能? 没有指定成员?
- C 成员功能
- =删除用户定义的成员功能,除了构造函数,分配运算符C 11
- C 朋友课程和朋友成员功能
- C 函数调用包装器包含类成员功能作为模板参数
- 共享库中静态功能成员的破坏顺序
- 可以使用仅功能成员属性进行回调界面
- 虚拟方法与std ::功能成员变量在性能方面
- 虚拟继承和功能成员
- 指向功能成员和非成员的指针