指向成员的指针使用得不多,但它们非常强大,您是如何使用它们的,您做过的最酷的事情是什么?
编辑:--这并不是列出可能的事情,例如列出boost::bind和boost::函数不是很好。相反,也许与他们一起使用是很酷的?我知道他们自己很酷,但这不是问题所在。
发布于 2009-04-08 18:57:22
我曾经需要将标准数据作为纯结构进行操作,以便能够在队列中存储所有条件的列表。我不得不将结构绑定到GUI和其他过滤器元素,等等,所以我想出了一个解决方案,其中使用指向成员的指针,以及指向成员函数的指针。
假设你有一个
struct Criteria
{
typedef std::string Criteria::* DataRefType;
std::string firstname;
std::string lastname;
std::string website;
};字段的字符串表示形式进行绑定。
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、序列化、按字段名进行比较等。
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 );或
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;
};发布于 2009-04-08 18:24:14
指向成员函数的指针对于使用for_each创建psuedo表达式非常有用。
vector<SomeClass*> v = getAVector();
for_each(v.begin(), v.end(), mem_fun(&SomeClass::print));发布于 2009-04-08 18:28:41
我对他们做的最酷的事,我很久以前就做过了。今天可能有更好的办法。
我为网络管理工具创建了一个自生成命令行解析器.表示要管理的对象的类都有自己的子类表(名称、指针到工厂成员)、实例(id、从列表指针到实例)和命令(名称、指向成员函数的指针)。这使解析器能够处理以下内容:
SET NETWORK ROUTE 192.168.0.0 HOPS 1或
QUERY NETWORK NAMESERVER servername不知道任何关于路线的信息,也不知道服务器的名称。
https://stackoverflow.com/questions/731208
复制相似问题