在下面的代碼中,我想實現特定類型定義的二元運算符鏈接效果,我想使用 - 對於平凡的運算符鏈接,二元運算符返回相同類型的對象,大多數情況下只是簡單地返回*this
,它可以平均再次用於鏈接相同類型的下一個對象。然而,就我而言,二元運算符將兩個相同類型對象(awaitable<T>::ref
)的兩個reference_wrappers作爲輸入,並返回類型爲(awaitable<awaitable<T>::ref>
)的聚合對象,並且我想使用返回的聚合對象來鏈接接下來awaitable<T>::ref
並再次返回awaitable<awaitable<T>::ref>
類型的進一步彙總對象 - 注意,無論發生多少鏈接,返回的對象始終是awaitable<awaitable<T>::ref>
的相同類型。C++ 11/14模板模板參數重載的朋友操作符
模板模板參數定義在位置(XXX)的朋友操作符希望能達到此目的,但編譯器似乎不願意執行綁定。
任何人都可以闡明我如何實現所述的結果?
謝謝!
#include <functional>
template <typename T>
struct awaitable
{
typedef std::reference_wrapper<awaitable> ref;
// (A) - okay
friend awaitable<ref> operator||(ref a1, ref a2)
{
awaitable<ref> r;
return r;
}
// (XXX) - this doesn't bind
template < template <typename> class _awaitable >
friend awaitable<ref> operator||(typename awaitable<typename _awaitable<T>::ref>::ref a1, ref a2)
{
awaitable<ref> r;
return r;
}
};
int main(int argc, const char * argv[])
{
awaitable<void> a1;
awaitable<void> a2;
auto r1 = a1 || a2; // Okay - r1 is of type awaitable<awaitable<void>::ref>
awaitable<void> a3;
auto r3 = r1 || a3; // doesn't bind to the operator defined at XXX
return 0;
}
[編輯] -
答案在this崗位和this似乎說明情況非常好聽,但對我來說,朋友經營者有一個模板,模板參數(這是需要避免重複模板實例化),這可能會阻止編譯器在模板實例化時生成正確的名稱空間作用域函數?
對不起,我的編輯,我試圖簡化代碼並儘可能消除任何可能的混淆,並希望上面的代碼應該非常簡單易讀(根本不需要向下滾動!) – Dejavu
注意:輸入對象都是reference_wrapper包裝的,我特別不想複製發生,並在真正的代碼中,複製構造函數被刪除 – Dejavu