一个指针传递给一个成员函数作为模板参数。为什么这项工作?
题
我有一些代码,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;
};
此模板被实例化并在库中,根据使用的类型栏和巴兹像这样的:
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 ::绑定调用的getter / setter函数来绕过它需要去的数据。 如何和为什么传递指针到成员用作模板参数像在这种情况下工作?
在响应于评论,我还没有意识到,指针成员函数是有效的模板参数。这不是我“在野外”见过。我想它和它的工作,但我不是很期待。
解决方案
我认为这是一个更好的解释了为什么有可能这样做比“因为标准是这样说的”:
它工作的原因是因为指针到成员是在编译时(指针到构件被有效的从一个类的开始偏移的构件的)已知的恒定值。因此,它们可被用作模板参数,正如任何其他整数常数即可。
在另一方面,正常指针没有编译时间常数,因为它们依赖于存储器布局只存在于运行时。它们不能是模板参数。
其他提示
当你问沿着“为什么的的东西的作品?”的台词问题,这意味着,它的作品其实是某种令人惊讶的你。这是不可能回答这个问题,除非你解释的为什么的你感到惊讶。
为什么它的工作原理?因为语言规范明确指出,应当编制。有没有其他的答案,直到你更详细地解释您的问题。
不隶属于 StackOverflow