C++ 将指向成员函数的指针作为模板参数传递。为什么这样做有效?
我有一些100%适用于我的用例的代码。我只是想知道是否有人能解释它是如何工作的以及为什么工作的 我有一个模板类,它位于处理线程和网络通信的代码和库用户之间,用于将从服务器接收到的数据传递给用户C++ 将指向成员函数的指针作为模板参数传递。为什么这样做有效?,c++,templates,boost,standards,C++,Templates,Boost,Standards,我有一些100%适用于我的用例的代码。我只是想知道是否有人能解释它是如何工作的以及为什么工作的 我有一个模板类,它位于处理线程和网络通信的代码和库用户之间,用于将从服务器接收到的数据传递给用户 template <class Bar, class Baz, class BazReturnType, void (Bar::*BarSetterFunction)(const BazReturnType &),
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;
};
模板
福班
{
Foo(Bar*Bar)
:毫巴(巴)
{
}
void FooMemberFunction(常量Baz*Baz)
{
boost::bind(BarSetterFunction,m_-bar,
boost::bind(BazGetterFunction,baz)()();
}
巴*m_巴;
};
根据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 );
typedef Foo
美孚;
MyBar*bar=新的MyBar;
MyBaz*baz=新MyBaz;
MyFoo*f=新的MyFoo(bar);
f->FooMemberFunction(baz);
这一切都是可行的,boost::bind调用getter/setter函数来传递数据像本例中那样,将指针作为模板参数传递给成员函数的方式和原因是什么?
作为对评论的回应,我没有意识到指向成员函数的指针是有效的模板参数。这不是我以前在“野外”见过的东西。我试过了,结果成功了,但我没想到会成功 当你问一个类似于“为什么某些东西能工作?”的问题时,这意味着它能工作的事实在某种程度上让你感到惊讶。要回答这个问题是不可能的,除非你解释为什么你会感到惊讶
为什么有效?因为语言规范明确规定它应该工作。除非你更详细地解释你的担忧,否则没有其他答案。我认为有一个更好的解释可以解释为什么可以这样做,而不是“因为标准这么说”: 它工作的原因是,指向成员的指针是编译时已知的常量值(指向成员的指针实际上是成员从类开始的偏移量)。因此,它们可以用作模板的参数,就像任何其他整数常量一样
另一方面,普通指针不是编译时常量,因为它们依赖于仅在运行时存在的内存布局。它们不能是模板参数。我不确定我是否完全理解您的要求。指向成员的指针是允许的非类型模板参数类型之一。您只是想在标准中找到这方面的参考吗?14.1/4[temp.param]我猜答案是“因为语言规范这么说”。根据标准,我没有意识到指向成员函数的指针是有效的模板参数。