คำถามติดแท็ก variadic-templates

เทมเพลต Variadic เป็นเทมเพลตที่รับพารามิเตอร์จำนวนตัวแปร

8
“ เปิดออก” tuple เพื่อเรียกตัวชี้ฟังก์ชั่นการจับคู่
ฉันพยายามที่จะเก็บในstd::tupleจำนวนที่แตกต่างกันของค่าซึ่งในภายหลังจะใช้เป็นข้อโต้แย้งสำหรับการโทรไปยังตัวชี้ฟังก์ชั่นที่ตรงกับประเภทที่เก็บไว้ ฉันได้สร้างตัวอย่างแบบง่าย ๆ ที่แสดงปัญหาที่ฉันพยายามแก้ไข: #include <iostream> #include <tuple> void f(int a, double b, void* c) { std::cout << a << ":" << b << ":" << c << std::endl; } template <typename ...Args> struct save_it_for_later { std::tuple<Args...> params; void (*func)(Args...); void delayed_dispatch() { // How can I "unpack" params to …

6
make_unique และการส่งต่อที่สมบูรณ์แบบ
เหตุใดจึงไม่มีstd::make_uniqueเทมเพลตฟังก์ชันในไลบรารี C ++ 11 มาตรฐาน ฉันหา std::unique_ptr<SomeUserDefinedType> p(new SomeUserDefinedType(1, 2, 3)); verbose เล็กน้อย ต่อไปนี้จะดีกว่านี้ไหม auto p = std::make_unique<SomeUserDefinedType>(1, 2, 3); สิ่งนี้ซ่อนสิ่งที่newดีและกล่าวถึงเพียงครั้งเดียวเท่านั้น อย่างไรก็ตามนี่คือความพยายามของฉันในการดำเนินการmake_unique: template<typename T, typename... Args> std::unique_ptr<T> make_unique(Args&&... args) { return std::unique_ptr<T>(new T(std::forward<Args>(args)...)); } ฉันใช้เวลาพอสมควรในการstd::forwardรวบรวมสิ่งต่าง ๆ แต่ฉันไม่แน่ใจว่ามันถูกต้องหรือไม่ ใช่ไหม? std::forward<Args>(args)...หมายความว่าอะไรกันแน่? คอมไพเลอร์ทำอะไรได้บ้าง

1
หนึ่งจะเรียก std :: ส่งต่ออาร์กิวเมนต์ทั้งหมดในฟังก์ชันตัวแปรได้อย่างไร
ฉันแค่เขียนโรงงานออบเจ็กต์ทั่วไปและใช้เมตาไลบรารีของตัวประมวลผลก่อนเร่งความเร็วเพื่อสร้างเทมเพลตแบบต่างๆ (ใช้ 2010 และไม่รองรับ) ฟังก์ชันของฉันใช้การอ้างอิง rval และstd::forwardเพื่อทำการส่งต่อที่สมบูรณ์แบบและทำให้ฉันคิดว่า ... เมื่อ C ++ 0X ออกมาและฉันมีคอมไพเลอร์มาตรฐานฉันจะทำสิ่งนี้กับเทมเพลตตัวแปรจริง ฉันจะเรียกร้องstd::forwardให้มีการโต้แย้งได้อย่างไร? template <typename ...Params> void f(Params... params) // how do I say these are rvalue reference? { y(std::forward(...params)); //? - I doubt this would work. } วิธีเดียวที่ฉันคิดได้ว่าจะต้องมีการเปิดกล่อง ... params ด้วยตนเองและฉันก็ยังไม่ค่อยอยู่ที่นั่นเช่นกัน มีไวยากรณ์ที่เร็วกว่าที่จะใช้งานได้หรือไม่?

2
โทเค็น“ ……” มีความหมายว่าอย่างไร? คือตัวดำเนินการจุดไข่ปลาคู่บนชุดพารามิเตอร์
ในขณะที่เรียกดูการใช้งานส่วนหัว C ++ 11 ใหม่ในปัจจุบันของ gcc ฉันพบโทเค็น "...... " คุณสามารถตรวจสอบได้ว่าโค้ดต่อไปนี้คอมไพล์ดี [ผ่าน ideone.com] template <typename T> struct X { /* ... */ }; template <typename T, typename ... U> struct X<T(U......)> // this line is the important one { /* ... */ }; ความหมายของโทเค็นนี้คืออะไร? แก้ไข: ดูเหมือนว่า SO ถูกตัด "...... " ในชื่อคำถามเป็น …

2
อะไรคือกฎสำหรับโทเค็น“ …” ในบริบทของเทมเพลตแบบต่างๆ
ใน C ++ 11 มีเทมเพลตที่หลากหลายเช่นนี้: template< class T, class... Args > unique_ptr<T> make_unique( Args&&... args ) { return unique_ptr<T>(new T(std::forward<Args>(args)...)); } มีวิทยากรบางคนเกี่ยวกับเรื่องนี้: การแสดงออกstd::forward<Args>(args)...ใช้ทั้งArgsและargsแต่เพียงหนึ่ง...โทเค็น นอกจากนี้ยังstd::forwardเป็นฟังก์ชันเทมเพลตที่ไม่แปรผันโดยใช้พารามิเตอร์เทมเพลตเดียวและอาร์กิวเมนต์เดียว กฎไวยากรณ์สำหรับสิ่งนั้น (คร่าวๆ) คืออะไร? จะสรุปได้อย่างไร? นอกจากนี้: ในการใช้งานฟังก์ชันจุดไข่ปลา ( ...) อยู่ที่ส่วนท้ายของนิพจน์ที่สนใจ มีเหตุผลไหมที่ในรายการอาร์กิวเมนต์เทมเพลตและรายการพารามิเตอร์ที่จุดไข่ปลาอยู่ตรงกลาง

4
วิธีจัดเก็บอาร์กิวเมนต์แม่แบบตัวแปร
เป็นไปได้ไหมที่จะจัดเก็บชุดพารามิเตอร์เพื่อใช้ในภายหลัง? template <typename... T> class Action { private: std::function<void(T...)> f; T... args; // <--- something like this public: Action(std::function<void(T...)> f, T... args) : f(f), args(args) {} void act(){ f(args); // <--- such that this will be possible } } จากนั้นในภายหลัง: void main(){ Action<int,int> add([](int x, int y){std::cout << (x+y);}, 3, …

11
สวย - พิมพ์ std :: tuple
นี่เป็นคำถามที่ตามมาจากคำถามก่อนหน้าของฉันเกี่ยวกับคอนเทนเนอร์ STL ที่มีการพิมพ์สวยซึ่งเราได้จัดการเพื่อพัฒนาโซลูชันที่หรูหราและใช้งานทั่วไป ในขั้นตอนต่อไปนี้ฉันต้องการรวมการพิมพ์ที่สวยงามสำหรับการstd::tuple<Args...>ใช้เทมเพลตตัวแปร (ดังนั้นนี่คือ C ++ 11 อย่างเคร่งครัด) สำหรับstd::pair<S,T>ฉันพูดง่ายๆ std::ostream & operator<<(std::ostream & o, const std::pair<S,T> & p) { return o << "(" << p.first << ", " << p.second << ")"; } โครงสร้างที่คล้ายคลึงกันสำหรับการพิมพ์ทูเพิลคืออะไร? ฉันได้ลองใช้การแยกสแต็กอาร์กิวเมนต์เทมเพลตหลายบิตส่งดัชนีไปรอบ ๆ และใช้ SFINAE เพื่อค้นหาว่าฉันอยู่ที่องค์ประกอบสุดท้าย แต่ไม่ประสบความสำเร็จ ฉันไม่เป็นภาระให้คุณด้วยรหัสที่เสียของฉัน หวังว่าคำอธิบายปัญหาจะตรงไปตรงมาเพียงพอ โดยพื้นฐานแล้วฉันต้องการพฤติกรรมต่อไปนี้: auto a = std::make_tuple(5, "Hello", -0.1); …

1
C ++ 11: จำนวนพารามิเตอร์ฟังก์ชันแม่แบบตัวแปร?
ฉันจะนับจำนวนอาร์กิวเมนต์ของฟังก์ชันเทมเพลตตัวแปรได้อย่างไร กล่าวคือ: template<typename... T> void f(const T&... t) { int n = number_of_args(t); ... } วิธีใดที่ดีที่สุดในการนำไปใช้number_of_argsในข้างต้น

3
ฉันจะสร้างวิธีที่ประเภทรายการคาร์ทีเซียนใน C ++ ได้อย่างไร
อธิบายตนเอง โดยพื้นฐานแล้วฉันมีรายการประเภทดังนี้: using type_list_1 = type_list<int, somestructA>; using type_list_2 = type_list<somestructB>; using type_list_3 = type_list<double, short>; พวกเขาสามารถเป็นจำนวนชนิดรายการ ฉันจะพิมพ์ดีดของผลิตภัณฑ์คาร์ทีเซียนได้อย่างไร result = type_list< type_list<int, somestructB, double>, type_list<int, somestructB, short>, type_list<somestructA, somestructB, double>, type_list<somestructA, somestructB, short> >; ฉันตะลุยวิธีการสร้างผลิตภัณฑ์คาร์ทีเซียนแบบสองทางตามที่กำหนดไว้ที่นี่: วิธีสร้างผลิตภัณฑ์คาร์ทีเซียนของรายการประเภท แต่ดูเหมือนไม่มีทางน่ารำคาญเลย ตอนนี้ฉันกำลังพยายาม ... template <typename...> struct type_list{}; // To concatenate template <typename... Ts, typename... …

3
เทมเพลต Variadic: เปิดเผยอาร์กิวเมนต์ในกลุ่ม
ฉันมีฟังก์ชั่นที่รับสองอาร์กิวเมนต์: template <typename T1, typename T2> void foo(T1 arg1, T2 arg2) { std::cout << arg1 << " + " << arg2 << '\n'; } และอีกหนึ่งตัวแปรที่ควรส่งต่อข้อโต้แย้งเป็นคู่: template <typename... Args> void bar(Args&&... args) { static_assert(sizeof...(Args) % 2 == 0); ( foo( std::forward<Args>(args), std::forward<Args>(args) ), ... ); // ^ Sends each argument twice, …

5
วิธีการจัดกลุ่มหรือการพับคู่ของชุดพารามิเตอร์?
template<class Msg, class... Args> std::wstring descf(Msg, Args&&... args) { std::wostringstream woss; owss << Msg << ". " << ... << " " << args << ": '" << args << "' ";//not legal at all //or owss << Msg << ". " << args[0] << ": '" << args[1] << …
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.