首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >使用指向成员和成员函数的指针有什么最佳用途?

使用指向成员和成员函数的指针有什么最佳用途?
EN

Stack Overflow用户
提问于 2009-04-08 18:21:05
回答 8查看 285关注 0票数 2

指向成员的指针使用得不多,但它们非常强大,您是如何使用它们的,您做过的最酷的事情是什么?

编辑:--这并不是列出可能的事情,例如列出boost::bind和boost::函数不是很好。相反,也许与他们一起使用是很酷的?我知道他们自己很酷,但这不是问题所在。

EN

回答 8

Stack Overflow用户

回答已采纳

发布于 2009-04-08 18:57:22

我曾经需要将标准数据作为纯结构进行操作,以便能够在队列中存储所有条件的列表。我不得不将结构绑定到GUI和其他过滤器元素,等等,所以我想出了一个解决方案,其中使用指向成员的指针,以及指向成员函数的指针。

假设你有一个

代码语言:javascript
复制
struct Criteria
{
    typedef std::string Criteria::* DataRefType;
    std::string firstname;
    std::string lastname;
    std::string website;
};

字段的字符串表示形式进行绑定。

代码语言:javascript
复制
class Field
{
public:
    Field( const std::string& name,
           Criteria::DataRefType ref ):
        name_( name ),
        ref_( ref )
    {}
    std::string getData( const Criteria& criteria )
    {
        return criteria.*ref_;
    }
    std::string name_;
private:
    Criteria::DataRefType ref_;
};

然后,您可以随时注册要使用的所有字段: GUI、序列化、按字段名进行比较等。

代码语言:javascript
复制
class Fields
{
public:
    Fields()
    {
        fields_.push_back( Field( "First Name", &Criteria::firstname ) );
        fields_.push_back( Field( "Last Name", &Criteria::lastname ) );
        fields_.push_back( Field( "Website", &Criteria::website ) );
    }
    template < typename TFunction >
    void forEach( TFunction function )
    {
        std::for_each( fields_.begin(), fields_.end(),
                       function );
    }
private:
    std::vector< Field > fields_;
};

例如,通过调用fields.forEach( serialization );

代码语言:javascript
复制
GuiWindow( Criteria& criteria ):
    criteria_( criteria )
{
    fields_.forEach( std::bind1st( 
                         std::mem_fun( &GuiWindow::bindWithGui ),
                         this ) );
}
void bindWithGui( Field field )
{
    std::cout << "name " << field.name_
              << " value " << field.getData( criteria_ ) << std::endl;
};
票数 5
EN

Stack Overflow用户

发布于 2009-04-08 18:24:14

指向成员函数的指针对于使用for_each创建psuedo表达式非常有用。

代码语言:javascript
复制
vector<SomeClass*> v = getAVector();
for_each(v.begin(), v.end(), mem_fun(&SomeClass::print));
票数 3
EN

Stack Overflow用户

发布于 2009-04-08 18:28:41

我对他们做的最酷的事,我很久以前就做过了。今天可能有更好的办法。

我为网络管理工具创建了一个自生成命令行解析器.表示要管理的对象的类都有自己的子类表(名称、指针到工厂成员)、实例(id、从列表指针到实例)和命令(名称、指向成员函数的指针)。这使解析器能够处理以下内容:

代码语言:javascript
复制
SET NETWORK ROUTE 192.168.0.0 HOPS 1

代码语言:javascript
复制
QUERY NETWORK NAMESERVER servername

不知道任何关于路线的信息,也不知道服务器的名称。

票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/731208

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档