最近我發現shared_ptr
沒有指向成員操作符->*
的指針。我創建了一個簡單的例子:關於shared_ptr和指向成員操作符` - > *`和`std :: bind`的指針
template <typename Pointer, typename Function, typename... Args>
auto invoke1(Pointer p, Function f, Args... args) -> decltype((p->*f)(args...))
{
return (p->*f)(args...);
}
struct A {
void g() { std::cout << "A::g()\n"; }
};
int main() {
A a;
invoke1(&a, &A::g); // works!!
std::shared_ptr<A> sa = std::make_shared<A>();
invoke1(sa, &A::g); // compile error!!
}
Q1:爲什麼會這樣?爲什麼shared_ptr沒有這個操作符?
我加了這樣的運營商shared_ptr
和例子開始工作:
template <typename T, typename Result>
auto operator ->* (std::shared_ptr<T> pointer, Result (T::*function)()) ->decltype(std::bind(function, pointer))
{
return std::bind(function, pointer);
}
template <typename T, typename Result, typename Arg1>
auto operator ->* (std::shared_ptr<T> pointer, Result (T::*function)(Arg1 arg1)) ->decltype(std::bind(function, pointer, std::placeholders::_1))
{
return std::bind(function, pointer, std::placeholders::_1);
}
Q2:這是該運營商正確實施?有沒有什麼地方有任何「黃金」規則來實施這樣的操作員,可能是我重新發明了輪子,或者完全走錯了方向,你怎麼看?有沒有辦法有一個單獨的功能有佔位性病執行這一操作,而不是儘可能多的功能...
之後,我來到了結論,std::bind
可以在我的invoke
方法可以使用。
template <typename Pointer, typename Function, typename... Args>
auto invoke2(Pointer p, Function f, Args... args)
-> decltype(std::bind(f, p, args...)())
{
return std::bind(f, p, args...)();
}
這樣我的例子也工作沒有必要添加operator ->*
到shared_ptr
。
Q3:那麼,是std::bind
現在視爲operator->*
更換?
你試過了嗎:invoke1(sa。得到(),&A::g); – Alexis
@Alexis - 是的,我已經嘗試過,當然它的工作原理,但我認爲這個解決方法對於我的問題並不重要。 – PiotrNycz
我甚至不知道你可以重載那個操作符。 – Mehrdad