簡體   English   中英

如何使用“auto”來聲明指向重載成員函數的指針?

[英]How to use 'auto' for declaring a pointer to an overloaded member function?

如果我有一個重載的非靜態成員函數,我如何使用auto為該函數的一個版本聲明一個指針?

struct Foo{
   void bar(){}
   void bar(int){}
};

auto ptr = &Foo::bar; // error: unable to deduce 'auto' from '&Foo::bar'

你沒有。

好吧,您可以對正確的指針類型進行顯式轉換,但這與僅將正確的指針類型替換為auto確實沒有什么不同:

using bar_ptr = void (Foo::*)();

bar_ptr ptr = &Foo::bar;

//or

auto ptr = (bar_ptr)&Foo::bar;

您可以避免通過這樣一組函數明確提及完整類型:

template <class... Params, class R>
    auto ovl(R(*f)(Params...)) {
    return f;
}

template <class... Params, class R, class T>
    auto ovl(R(T::*f)(Params...)) {
    return f;
}

template <class... Params, class R, class T>
    auto ovl_const(R(T::*f)(Params...) const) {
    return f;
}

用法如下,提供目標函數的參數類型:

auto ptr = ovl<int>(&Foo::bar);

在 Wandbox 上實時觀看

varargs、 volatile 、ref-qualified 等成員函數的重載留給讀者作為練習。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

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