![](/img/trans.png)
[英]Why is declaration order important for passing a member function pointer as a template argument?
[英]Passing a pointer to a member function as a template argument. Why does this work?
我有一些代碼可以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函數將數據傳遞到需要傳遞的地方。 在這種情況下,如何以及為什么將指向成員函數的指針作為模板參數傳遞?
在回應評論時,我還沒有意識到指向成員函數的指針是有效的模板參數。 這不是我以前在野外看到的東西。 我嘗試了一下,它奏效了,但是我沒想到它能奏效。
我認為比“因為標准這樣說”,還有一個更好的解釋為什么可以做到這一點:
它起作用的原因是因為指向成員的指針是在編譯時已知的常量值(指向成員的指針實際上是成員從類開始的偏移量)。 因此,它們可以用作模板的參數,就像其他任何整數常量一樣。
另一方面,普通指針不是編譯時間常數,因為它們取決於僅在運行時才存在的內存布局。 它們不能是模板參數。
當您按照“為什么某些東西起作用?”的方式提出問題時,這意味着它起作用的事實某種程度上令您感到驚訝。 除非您解釋為什么會感到驚訝,否則無法回答該問題。
為什么有效? 因為語言規范明確指出它將起作用。 沒有其他答案,除非您更詳細地解釋您的擔憂。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.