[英]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);
varargs、 volatile
、ref-qualified 等成員函數的重載留給讀者作為練習。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.