1樓:CircleSir233
可以嘗試使用柯里化,把f(a, b, c, d)的呼叫變成f(a)(b)(c)(d),這樣只需要使用迴圈每次傳入乙個引數即可。
#include
#include
#include
#include
template
...> struct Curry ;template Ret> struct Curry operator Ret() };template Ret, typename First ,typename ...Others >struct Curry First ,Others ...> Curry Others ...> operator ()(First arg));} template FirstArg ,typename SecondArg ,typename ...OtherArgs >auto operator ()(FirstArg first ,SecondArg second ,OtherArgs ...otherArgs)}; template Ret, typename ...Args >Curry Args ...> makeCurry (std ::function Args ...) >function )template Ret> Retcall (Curry curryFunc ,std ::vector any>:: iterator unused )template Ret, typename First ,typename ...Others >Retcall (Curry First ,Others ...> curryFunc ,std ::vector any>:: iterator args )int main(); std:: cout < )(3)(4 )(5)(6 )< endl ;// 18 std:: cout < )(3,4 ,10.1)(6 )< endl ;// 23.1 std:: vector any> args=; std:: cout < (makeCurry(f ),args .begin ())<< std:: endl ;// 11.4} 2樓:rayhunter 好問題,元程式設計愛好者嘗試回答,只是這個功能,C++11就可以實現,純造輪子,不借用標準庫功能,比如tuple,make_index_sequence。 模板元程式設計中有乙個比較重要的核心思想是:型別T不是簡單只修飾引數或變數,而是作輸入與變換,儲存及輸出,換句話說,就是一些沒有定義一些沒有成員輔助類,對輸入T進行處理,純粹編譯期處理型別。 myFunctions可以就用來的templatevoid myFuncion(T*... param)宣告即可,T...還是Call的T... 型別,我們需要一些手段儲存型別與轉換型別。 TypeList儲存可變型別 GetTypeListTypeHelp提取第N個型別 TL_N_Type_Point重定義一下,提取第N個型別的指標 SeqIndex,MakeSeq序列與序列生成器,這個受限遞規層次限制,沒有C++14的內建的make_index_sequence,index_sequence強。 myFuncionHelp關鍵輔助函式,主要用來將儲存好的TypeList型別序列提取出第N個型別作myFunctions模板引數,及將型別和Vec[N]引數包展開,這個函式設計完我非常開心!!! // by Rayhunterli // 2021/9/7 #include #include class A{}; class B{}; class C{}; class D{}; class E{}; class F{}; template ...T >void myFuncion(T *... param )// 型別列表 template ...T >struct TypeList ;template T>struct TypeList typename ...TN >struct TypeList TN... >: public TypeList >;// 獲取型別列表 template TList ,size_t N>struct GetTypeListTypeHelp ;template TList >struct GetTypeListTypeHelp >;template TList ,size_t N>using TL_N_Type_Point =typename GetTypeListTypeHelp >:: TypeOut*; // 簡單序列 template ...N >struct SeqIndex ;template ...T >struct ConSeq ;template size_t ...PN >struct ConSeq >>: public SeqIndex PN+1)... >{};template N>struct MakeSeq :public ConSeq <0>,typename MakeSeq Type >{};template <>struct MakeSeq <1>: public SeqIndex <0>{};template <>struct MakeSeq <0>: public SeqIndex <>{};// 輔助函式 template ...T ,size_t ...N >void myFuncionHelp (std ::vector *>&rVec ,TypeList >,SeqIndex >)template ...T >void Call(); myFuncionHelp (kVec ,FunTypeList (),FunIndexType ()); }int main ()喜歡給個贊,3Q! 3樓:lichray 這個問題有一處頗有意思的地方,就是 myFunction 的引數列表應該是什麼。它不能是 T*..., 因為 vec[0], vec[1], … 全是 void*. 不過標準庫正好有乙個 trait 可以把任何型別對映成 void ——std::void_t Walter E. Brown, 還是你厲害… 先把 myFunction 宣告成這樣: template ...T>void myFunction (std ::void_t args );編譯時展開下標 pack 這個問題在 C++17 裡需要寫乙個輔助函式。想寫的話可以參考一下 std::to_array - cppreference. com. 這裡我記錄乙個在 C++20 裡特別簡單的寫法: template ...T>void call()( std:: index_sequence_for >()); // i want to trans the vec to the input prams of myFunction[& ] ...I >(std ::index_sequence >)(std:: index_sequence_for >()); }利用 lambda 表示式可以帶模版形參列表的特點,通過立即呼叫自己繫結 std::index_sequence 實參。熟悉 Scheme 的話,會明白這就是乙個 let. 有了 index pack 就隨便了,可以直接展開乙個表示式,也可以配合 fold expression. Fold expression 還可以用來實現 myFunction : template ...T>void myFunction (std ::void_t args )Compiler Explorer - C++ (x86-64 gcc 11.2) 4樓:無敵母豬佩 //// call.hpp // template //// Created by 楊永康 on 2021/8/23. //#ifndef call_h #define call_h #include #include template ..._T >void create_vector (std ::vector shared_ptr >>&v ,_T&&...x); template T>void create_vector (std ::vector shared_ptr >>&v ,T&&x )}); }template class ..._T >void create_vector (std ::vector shared_ptr >>&v ,T&&x ,_T&&...y) });create_vector <_T... >(v,std ::forward <_T>(y )...); }template <>void create_vector (std ::vector shared_ptr >>&v ){}; template T>std:: ostream &print (std ::ostream&os ,std ::vector shared_ptr >>:: iterator beg) template classT1, class ..._T >std:: ostream &print (std ::ostream&os ,std ::vector shared_ptr >>:: iterator beg) #endif /* call_h */ //// main.cpp // template //// Created by 楊永康 on 2021/8/23. //#include #include"call.hpp" struct S ; int main(int argc, const char * argvinsert code here... std::vector> p; create_vector>(p,"abc",S(),); print>(std::cout, p.begin()); return 0;} 不知道為啥這麼多人反對。雖然。有些複雜不直觀。而且功能不強大,還完全可以通過其他方式代替,同時其他方式的實現還可以完成更多的功能。但是至少這種方法寫起來稍微。短那麼一些。 原子筆 C 標準委員會,只需引入乙個別的指令碼語言,放預處理後編譯期前去解釋執行,就可以簡單解決這些各種問題 巨集的功能太弱,但... 努力保持清醒的 最近一向有關TIOBE 程式設計言語排行榜,C 好像不進反退,不知為什麼會是這樣呢。話說C 寫起來感覺很不錯嘛,不知我們什麼感覺。turbo c 是老古董了,是DOS時代的C言語編譯器。Visual c 主要是用來編譯c 的,當然對c言語也是相容的。不過個人主張不要用Visual c... nouness 我猜上面說asio效能爛的都是使用姿勢問題 如果你是單個io service配合多執行緒使用的,那恭喜你,效能和併發上不去是正常的,io service裡有個鎖,是這個東東導致單個io service併發無法隨著執行緒增加而增加 高併發的使用姿勢是多個io service配合多執行緒...如何評價C 17中的新特性fold expression?
C 17 有哪些值得注意的新特性?
怎麼看待 C 17 眾多功能的流產?