Gra*_*erg 21 c++ standards templates boost
我有一些代码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;
};
Run Code Online (Sandbox Code Playgroud)
这个模板被实例化并在库中使用,具体取决于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 );
Run Code Online (Sandbox Code Playgroud)
这一切都有效,boost :: bind调用getter/setter函数来传递数据需要去的地方. 如何以及为什么将指向成员函数的指针作为模板参数传递,就像在这种情况下一样?
在回应评论时,我没有意识到指向成员函数的指针是有效的模板参数.这不是我之前在"野外"看过的东西.我尝试了它并且它有效,但我没想到它.
kaa*_*lus 34
我认为有一个更好的解释为什么可以这样做而不是"因为标准这样说":
它起作用的原因是因为指向成员的指针是在编译时已知的常量值(指向成员的指针实际上是成员从类的开头的偏移量).因此,它们可以用作模板的参数,就像任何其他整数常量一样.
另一方面,普通指针不是编译时常量,因为它们依赖于仅在运行时存在的内存布局.它们不能是模板参数.
| 归档时间: |
|
| 查看次数: |
12332 次 |
| 最近记录: |