【发布时间】:2010-12-25 08:39:42
【问题描述】:
我有一些代码 100% 适用于我的用例。我只是想知道是否有人可以解释它的工作原理和原因。
我有一个模板类,它位于处理线程和网络通信的一些代码与库用户之间,用于将从服务器接收到的数据传递给用户。
template <class Bar,
class Baz,
class BazReturnType,
void (Bar::*BarSetterFunction)(const BazReturnType &),
BazReturnType (Baz::*BazGetterFunction)(void) const>
class Foo
{
Foo( Bar *bar )
: m_bar(bar)
{
}
void FooMemberFunction( const Baz *baz )
{
boost::bind( BarSetterFunction, m_bar,
boost::bind( BazGetterFunction, baz )() ) ();
}
Bar *m_bar;
};
这个模板根据 Bar 和 Baz 的类型被实例化并在库中使用,如下所示:
typedef Foo<MyBar,
MyBaz,
ReturnTypeFromBazGetterFunction,
&MyBar::ActualSetterFunction,
&MyBaz::ActualGetterFunction >
MyFoo;
MyBar *bar = new MyBar;
MyBaz *baz = new MyBaz;
MyFoo *f = new MyFoo( bar );
f->FooMemberFunction( baz );
这一切都有效,boost::bind 调用 getter/setter 函数将数据传递到需要去的地方。 在这种情况下如何以及为什么将指向成员函数的指针作为模板参数传递?
针对 cmets,我没有意识到指向成员函数的指针是有效的模板参数。这不是我以前在“野外”见过的东西。我试过了,它奏效了,但我没想到会这样。
【问题讨论】:
-
我不确定我是否完全理解您的要求。指向成员的指针是允许的非类型模板参数类型之一。您是否只是在标准中寻找对此的参考? 14.1/4 [templ.param]
标签: c++ templates boost standards