簡體   English   中英

將指針傳遞給成員函數作為模板參數。 為什么這樣做?

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM