0

我嘗試寫一段代碼,將做到以下幾點:假設我們有自定義綁定功能的呼叫後C++,用函數的參數匹配定製的佔位符

auto bind_obj = bind(some_func, _1, "test") 

,我們有

auto res = bind_obj(42) 

其中函數some_func:

int some_func(int val, string test) 

如何能夠匹配參數佔位符在實際的函數調用中提供,即bind_obj(...)??

換句話說,就是可以遍歷的std ::元組(參數和佔位符這裏)和可變參數組(函數參數)到:

  1. 推斷功能some_func的返回類型;
  2. 使正確的std ::元組在some_func()調用中進一步使用它?

我想這樣做不使用boost和std :: functional。我認爲,我的主要問題是我不明白如何在運行時使用參數(所有佔位符正確替換)構建元組,並推導出返回類型。

我在STL「functional.h」中看到了_Mu模板結構,但它看起來過於複雜和過載。

+0

的''標準頭文件是C++的一部分。你通過「純C++」是什麼意思? – Shoe

+0

我想手動編寫參數和佔位符之間的匹配(非常可能,使用模板,是的) 上面的綁定僅僅是通常使用類似綁定函數的示例 –

+0

對不起,我認識到錯誤類型,應該是 bind some_func,_1,「test」)然後:bind_obj(42) –

回答

2

由於調用的參數列表和捕獲的參數列表大小不同,因此您不會真正遍歷它們。相反,你會得到一個函數評估它的行爲根據的論點是如何被抓獲:

  • 如果綁定元素是它返回的值
  • 一個值,如果綁定元素是它在返回參數的佔位符給定索引
  • 如果綁定元素是它返回評估此功能

假設你的綁定對象的結果綁定功能包含綁定參數的std::tuple<B...>稱爲b,那麼你可以建立一個的調用參數是這樣的:

template <typename... A, std::size_t... I> 
... bound::call(std::tuple<A...>&& aux, index_list<I...>) { 
    auto args = std::make_tuple(get_argument<I>(this->b, a)); 
    // ... 
} 
template <typename... A> 
... bound::operator()(A&&... args) { 
    return this->call(std::tie(std::forward<A>(args)..., make_index_list<sizeof...A>()); 
} 

這段代碼只是演示瞭如何獲取的參數排序的匹配。真正的工作發生在get_argument<I>(b, a)函數中,如果位於b處的索引I處的元素碰巧是佔位符,則返回由佔位符值指示的a的元素。

的代碼不包括關於如何創建一個索引列表的詳細信息,如何確定RHE返回類型呼叫一旦整理出來,或如何處理右值參數...

+0

謝謝!順便說一句,因爲我知道我們不能使用operator()作爲返回類型在C++ 14之前使用auto。請問您如何確定函數的返回類型? –

+0

@PeterLeontev:你真的會打電話給你的函數:'fun(std :: make_tuple(get_argument (this-> b,a))'這個類型就是'decltype(...) )'這個表達式對於函數調用操作符,您只需使用'call()'helper的'decltype(...)';如果它拒絕在尾部返回類型中使用'this'來獲取你可能需要使用'declval ()'(''T'是'this-> b'的類型)。 –

+0

再次感謝您。我嘗試過使用這種方法,但是爲什麼我們需要sizeof ... A>?如果sizeof ... B> sizeof ... A? –