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

เทมเพลตแท็กใช้ในหลายบริบท: การเขียนโปรแกรมทั่วไป (โดยเฉพาะ C ++) และการสร้างข้อมูล / เอกสารโดยใช้เทมเพลตเอนจิ้น เมื่อใช้แท็กนี้กับคำถามที่มีการใช้งานหนัก - ติดแท็กรหัสภาษาที่มีการใช้งาน

4
การเขียนโปรแกรมเมตาเทมเพลต
มีใครบางคนสามารถอธิบายให้ฉันฟังได้ว่าทำไมเมธอดการเขียนโปรแกรมเมตาเทมเพลตแรกกำลังจะวนซ้ำไม่สิ้นสุด แต่อันที่สองทำงานได้อย่างถูกต้อง #include <iostream> using namespace std; template<int N, int M> struct commondivs { static const int val = (N<M) ? commondivs<N,(M-N)>::val : commondivs<(N-M),M>::val; }; template<int N> struct commondivs<N,N> { static const int val = N; }; int commondiv(int N, int M){ if(N==M){ return N; } return (N<M)?commondiv(N,(M-N)):commondiv((N-M),M); } int …

2
ทำไม Remove_reference ไม่ทำงานกับฟังก์ชั่น?
วิ่งเข้าไปหาสิ่งที่แปลกประหลาดเมื่อทำเทมเพลต metaprogramming บางวัน โดยพื้นฐานแล้วมาจากการยืนยันนี้ไม่ผ่าน (อย่างที่ฉันคาดหวัง) static_assert(std::is_same_v<void(), std::remove_reference_t<void()&>>); ตอนแรกฉันคิดว่าฉันทำผิดพลาดทางไวยากรณ์ที่กำหนดฟังก์ชันอ้างอิง แต่การยืนยันนี้ผ่านไปโดยแสดงว่าไม่เป็นเช่นนั้น static_assert(std::is_same_v<void()&, void()&>); ฉันยังลองใช้remove_referenceตัวเองเพื่อคัดลอกแหล่งที่มาจาก cppreference แต่ก็ไม่ได้ผลเช่นกัน เกิดขึ้นที่นี่คืออะไร?
38 c++  templates  types  c++17 

4
โอเวอร์โหลดฟังก์ชันโดยใช้เทมเพลต
ฉันพยายามกำหนดฟังก์ชั่นโดยใช้เทมเพลตและฉันต้องการให้ typename เป็น int หรือ anEnum (enum เฉพาะที่ฉันกำหนดไว้) ฉันได้ลองทำสิ่งต่อไปนี้แล้ว แต่ล้มเหลว: template <int | anEnum T> // or <int T, anEnum T> or <int, anEnum T> bool isFunction(const T &aVariable){} สิ่งที่ฉันพยายามทำคือใช้เทมเพลตแทนการกำหนดฟังก์ชั่นโอเวอร์โหลดสองฟังก์ชัน ฉันต้องการฟังก์ชั่นที่จะเรียกว่าต่อไปนี้โดยไม่ต้องโปรแกรมเมอร์ต้องพิจารณาประเภท isFunction(aVariable) // and not isFunction<int> (aVariable) nor isFunction<anEnum> (aVariable) โดยทั่วไปฉันต้องการให้ฟังก์ชั่นนี้เป็นเทมเพลตสำหรับประเภท int และ aNum ฉันค้นหาสิ่งนี้แล้ว แต่ไม่พบคำตอบ ฉันจะพลาดอะไรได้บ้าง ขอบคุณ,

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... …

4
คอนเทนเนอร์ STL ที่มีประเภทเฉพาะเป็นอาร์กิวเมนต์ทั่วไป
มีวิธีที่ฉันสามารถสร้างฟังก์ชั่นที่ใช้ภาชนะที่มีประเภทเฉพาะ (ขอพูดstd::string) เป็นพารามิเตอร์ void foo(const std::container<std::string> &cont) { for(std::string val: cont) { std::cout << val << std::endl; } } และเรียกมันว่า stl container ทุกชนิดเป็น input หรือไม่? ชอบข้างบน? std::set<std::string> strset; std::vector<std::string> strvec; std::list<std::string> strlist; foo(strset); foo(strvec); foo(strlist);

1
'auto' เป็นตัวยึดอาร์กิวเมนต์เทมเพลตสำหรับพารามิเตอร์ฟังก์ชัน
C ++ 20 อนุญาตให้ใช้autoสำหรับประเภทพารามิเตอร์ฟังก์ชัน มันยังอนุญาตให้ใช้autoเป็นตัวยึดอาร์กิวเมนต์เทมเพลต (ไม่เหมือนกัน แต่ในจิตวิญญาณของเทมเพลต C ++ 17 <auto>ในทางใดทางหนึ่ง) สำหรับประเภทพารามิเตอร์ฟังก์ชันหรือไม่ ดังนั้นรหัสต่อไปนี้ก่อน C ++ 20: template<typename First, typename Second> void printPair(const std::pair<First, Second>& p) { std::cout << p.first << ", " << p.second; } สามารถเขียนเป็น: void printPair(const std::pair<auto, auto>& p) { std::cout << p.first << ", " << p.second; …
22 c++  templates  auto  c++20 

4
วิธีการเรียกตัวสร้างที่ถูกต้องของประเภทแม่แบบ?
ในรหัสต่อไปนี้ฉันจะทำให้บรรทัดที่มีความคิดเห็นทำงานในลักษณะเดียวกับบรรทัดที่อยู่เหนือบรรทัดได้อย่างไร Typeผมอยากจะทำให้มันเป็นโค้ดทั่วไปที่โทรคอนสตรัคที่เหมาะสมของแม่แบบ #include <string> #include <iostream> template <typename Type> struct Class { Type data; Class(Type data) : data(data) { } }; int main() { Class<std::string> a = std::string("abc"); // Class<std::string> b = "abc"; std::cout << a.data << std::endl; return 0; }

3
เหตุใดจึงทำให้ unique_ptr <Derived> ส่งไปยัง unique_ptr <Base> โดยปริยาย
ฉันเขียนรหัสต่อไปนี้ซึ่งใช้ในunique_ptr&lt;Derived&gt;ที่ที่unique_ptr&lt;Base&gt;คาดไว้ class Base { int i; public: Base( int i ) : i(i) {} int getI() const { return i; } }; class Derived : public Base { float f; public: Derived( int i, float f ) : Base(i), f(f) {} float getF() const { return f; } }; void …

1
ประเภทเทมเพลตและความกำกวมกลับอัตโนมัติ
ฉันมีฟังก์ชั่นเทมเพลตมากเกินไป: template&lt;typename T1, typename T2&gt; auto overMax(T1 a, T2 b) { std::cout &lt;&lt; __FUNCSIG__ &lt;&lt; std::endl; return b &lt; a ? a : b; } template&lt;typename RT, typename T1, typename T2&gt; RT overMax(T1 a, T2 b) { std::cout &lt;&lt; __FUNCSIG__ &lt;&lt; std::endl; return b &lt; a ? a : b; …

1
เสียงดังกราวถูกต้องหรือไม่ในการปฏิเสธรหัสที่คลาสที่ซ้อนกันของแม่แบบคลาสนั้นถูกกำหนดผ่านความเชี่ยวชาญเฉพาะทางหรือไม่
รับแม่แบบชั้นเรียนต่อไปนี้: template&lt;typename T&gt; struct Outer { struct Inner; auto f(Inner) -&gt; void; }; เรากำหนดInnerแยกต่างหากสำหรับแต่ละความเชี่ยวชาญของOuter: template&lt;&gt; struct Outer&lt;int&gt;::Inner {}; template&lt;&gt; struct Outer&lt;double&gt;::Inner {}; จากนั้นกำหนดฟังก์ชันสมาชิกfหนึ่งครั้งสำหรับความเชี่ยวชาญพิเศษทั้งหมดของOuter: auto Outer&lt;T&gt;::f(Inner) -&gt; void { } แต่เสียงดังกราว (9.0.0) บ่น: error: variable has incomplete type 'Outer::Inner' auto Outer&lt;T&gt;::f(Inner) -&gt; void ^ เราสามารถหลบเลี่ยงข้อผิดพลาดของคอมไพเลอร์โดยให้คำจำกัดความของInnerความเชี่ยวชาญอื่น ๆ ของOuter: template&lt;typename T&gt; struct Outer&lt;T&gt;::Inner …

4
ทำไม std :: function ไม่เข้าร่วมในการแก้ปัญหาโอเวอร์โหลด?
ฉันรู้ว่ารหัสต่อไปนี้จะไม่รวบรวม void baz(int i) { } void baz() { } class Bar { std::function&lt;void()&gt; bazFn; public: Bar(std::function&lt;void()&gt; fun = baz) : bazFn(fun){} }; int main(int argc, char **argv) { Bar b; return 0; } เนื่องจากstd::functionมีการกล่าวว่าไม่ต้องพิจารณาความละเอียดที่มากเกินไปเช่นที่ฉันอ่านในโพสต์นี้ ฉันไม่เข้าใจข้อ จำกัด ทางเทคนิคที่บังคับให้ใช้โซลูชันประเภทนี้อย่างเต็มที่ ฉันอ่านเกี่ยวกับขั้นตอนการแปลและเทมเพลตใน cppreference แต่ฉันไม่สามารถคิดได้ว่ามีเหตุผลใดที่ฉันไม่สามารถหาตัวอย่างตัวอย่างได้ อธิบายให้คนธรรมดาสามัญคนหนึ่ง (ยังใหม่กับ C ++) อะไรที่และในระหว่างขั้นตอนการแปลที่ทำให้ข้างต้นล้มเหลวในการรวบรวม?

2
เทมเพลตโอเวอร์โหลดที่ไม่ชัดเจน
ฉันมีรหัสเทมเพลตต่อไปนี้ #include &lt;vector&gt; #include &lt;array&gt; #include &lt;iostream&gt; template&lt;typename T1&gt; void foo(std::vector&lt;T1&gt; bar) { std::cout &lt;&lt; "GENERIC" &lt;&lt; std::endl; } template&lt;typename T1&gt; void foo(std::vector&lt;std::vector&lt;T1&gt;&gt; bar) { std::cout &lt;&lt; "SPECIFIC (vector)" &lt;&lt; std::endl; } template&lt;typename T1, int SIZE&gt; void foo(std::vector&lt;std::array&lt;T1, SIZE&gt;&gt; bar) { std::cout &lt;&lt; "SPECIFIC (array)" &lt;&lt; std::endl; } int main() …
16 c++  templates 

2
วิธีส่งการอ้างอิงไปยังอาร์กิวเมนต์ชื่อเทมเพลต
มีวิธีส่งการอ้างอิงเป็นอาร์กิวเมนต์ไปยังอาร์กิวเมนต์พิมพ์ชื่อแม่แบบหรือไม่ ฉันหมายถึงเช่นนั้นแทนที่จะผ่าน int ตัวอย่างเช่นเพื่อส่งการอ้างอิงไปยัง int template &lt;typename T&gt; struct Foo { Foo(T arg) : ptr(arg) {} T ptr; }; int main() { int* a = new int(6); Foo&lt;decltype(a)&gt; foo1(a); // ptr is a copy of a pointer Foo&lt;decltype(&amp;a)&gt; foo1(&amp;a); // ptr seems to be a pointer to a pointer } …
16 c++  templates 

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

5
จะมีตัวแปร const ใน for for loop สำหรับการสร้าง class template ได้อย่างไร?
ฉันมีรหัสเช่น template &lt;size_t N&gt; class A { template &lt;size_t N&gt; someFunctions() {}; }; ตอนนี้ฉันต้องการสร้างอินสแตนซ์ของคลาสและเรียกใช้ฟังก์ชันในการวนรอบสำหรับชุดของค่าจำนวนมากเช่น // in main() int main() { for (int i = 1; i &lt;= 100; i++) { const int N = i; // dont know how to do this A&lt;N&gt; a; a.functionCalls(); } } ทำอย่างไร หวังว่าจะมีวิธีการทำเช่นนี้

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.