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

C ++ เป็นภาษาโปรแกรมทั่วไป เดิมได้รับการออกแบบให้เป็นส่วนขยายของ C และมีไวยากรณ์ที่คล้ายกัน แต่ตอนนี้มันเป็นภาษาที่แตกต่างอย่างสิ้นเชิง ใช้แท็กนี้สำหรับคำถามเกี่ยวกับรหัส (จะ) คอมไพล์ด้วยคอมไพเลอร์ C ++ ใช้แท็กเฉพาะรุ่นสำหรับคำถามที่เกี่ยวข้องกับการแก้ไขมาตรฐานเฉพาะ [C ++ 11], [C ++ 14], [C ++ 17] หรือ [C ++ 20] เป็นต้น

3
ฉันจะรับความลึกของ std หลายมิติ :: เวกเตอร์ในเวลารวบรวมได้อย่างไร
ฉันมีฟังก์ชั่นที่ใช้หลายมิติstd::vectorและต้องการความลึก (หรือจำนวนมิติ) ที่จะส่งผ่านเป็นพารามิเตอร์เทมเพลต แทนที่จะเขียนโค้ดนี้ฉันอยากจะเขียนconstexprฟังก์ชั่นที่จะรับstd::vectorและคืนความลึกเป็นunsigned integerค่า ตัวอย่างเช่น: std::vector<std::vector<std::vector<int>>> v = { { { 0, 1}, { 2, 3 } }, { { 4, 5}, { 6, 7 } }, }; // Returns 3 size_t depth = GetDepth(v); สิ่งนี้จะต้องทำในเวลารวบรวมแต่เนื่องจากความลึกนี้จะถูกส่งผ่านไปยังฟังก์ชันเทมเพลตเป็นพารามิเตอร์เทมเพลต: // Same as calling foo<3>(v); foo<GetDepth(v)>(v); มีวิธีการทำเช่นนี้?

2
ทำไมโอเปอเรเตอร์! = ถูกลบใน C ++ 20 สำหรับไลบรารีมาตรฐานหลายประเภท?
อ้างอิงจากcppreference , std::type_info::operator!=ถูกลบด้วย C ++ 20, แต่std::type_info::operator==ดูเหมือนว่ายังคงอยู่ อะไรคือเหตุผลเบื้องหลัง ฉันอาจเห็นด้วยว่าการเปรียบเทียบความไม่เท่าเทียมนั้นไร้ความหมาย แต่จากนั้นการเปรียบเทียบความเท่าเทียมจะไม่มีความหมายเช่นกันใช่ไหม ในทำนองเดียวกันoperator!=ชนิดไลบรารีมาตรฐานอื่น ๆ อีกมากมายรวมถึงคอนเทนเนอร์เช่นstd::unordered_map::operator!=และstd::unordered_set::operator!=จะถูกลบใน C ++ 20 ตาม cppreference ต้องเขียนif(!(id1 == id2))ไม่ทำให้รหัสใด ๆ ที่ชัดเจนเมื่อเทียบกับif(id1 != id2)ในทางตรงกันข้าม ...

5
เป็นไปได้หรือไม่ที่จะป้องกันไม่ให้สมาชิกเริ่มต้นรวม?
ฉันมีโครงสร้างที่มีสมาชิกประเภทเดียวกันหลายคนเช่นนี้ struct VariablePointers { VariablePtr active; VariablePtr wasactive; VariablePtr filename; }; ปัญหาคือถ้าฉันลืมที่จะเริ่มต้นหนึ่งในสมาชิก struct (เช่นwasactive) เช่นนี้ VariablePointers{activePtr, filename} คอมไพเลอร์จะไม่บ่นเกี่ยวกับมัน แต่ฉันจะมีหนึ่งวัตถุที่เริ่มต้นได้เพียงบางส่วน ฉันจะป้องกันข้อผิดพลาดประเภทนี้ได้อย่างไร ฉันสามารถเพิ่มนวกรรมิกได้ แต่มันจะทำซ้ำรายการตัวแปรสองครั้งดังนั้นฉันต้องพิมพ์ทั้งหมดสามครั้งนี้! โปรดเพิ่มคำตอบC ++ 11หากมีวิธีแก้ปัญหาสำหรับ C ++ 11 (ขณะนี้ฉัน จำกัด เฉพาะรุ่นนั้น) อีกทั้งมาตรฐานภาษาล่าสุดก็ยินดีต้อนรับเช่นกัน!


7
วิธีที่เป็นนามธรรมเพื่อแยกแยะคอนสตรัคเตอร์ zero-arg สองตัว
ฉันมีชั้นเรียนเช่นนี้: struct event_counts { uint64_t counts[MAX_COUNTERS]; event_counts() : counts{} {} // more stuff }; โดยปกติฉันต้องการเริ่มต้น (ศูนย์) เริ่มต้นcountsอาร์เรย์ตามที่แสดง ที่ตำแหน่งที่เลือกที่ระบุโดยการทำโปรไฟล์อย่างไรก็ตามฉันต้องการระงับการกำหนดค่าเริ่มต้นของอาร์เรย์เนื่องจากฉันรู้ว่าอาร์เรย์กำลังจะถูกเขียนทับ แต่คอมไพเลอร์ไม่ฉลาดพอที่จะเข้าใจได้ อะไรคือวิธีที่ใช้สำนวนและมีประสิทธิภาพในการสร้างตัวสร้าง zero-arg แบบ "รอง" ดังกล่าว ขณะนี้ฉันใช้คลาสแท็กuninit_tagที่ส่งผ่านเป็นอาร์กิวเมนต์ดัมมี่เช่น: struct uninit_tag{}; struct event_counts { uint64_t counts[MAX_COUNTERS]; event_counts() : counts{} {} event_counts(uninit_tag) {} // more stuff }; จากนั้นฉันเรียกผู้สร้างที่ไม่เริ่มต้นเช่นevent_counts c(uninit_tag{});เมื่อฉันต้องการที่จะปราบปรามการก่อสร้าง ฉันเปิดกว้างสำหรับการแก้ปัญหาที่ไม่เกี่ยวข้องกับการสร้างชั้นเรียนจำลองหรือมีประสิทธิภาพมากกว่าในบางด้านเป็นต้น

2
วิธีการทำงานของ SFINAE ใน C ++
ฉันใช้ฟังก์ชั่น SFINAE อย่างหนักในโครงการและไม่แน่ใจว่ามีความแตกต่างใด ๆ ระหว่างสองวิธีต่อไปนี้ (นอกเหนือจากสไตล์): #include <cstdlib> #include <type_traits> #include <iostream> template <class T, class = std::enable_if_t<std::is_same_v<T, int>>> void foo() { std::cout << "method 1" << std::endl; } template <class T, std::enable_if_t<std::is_same_v<T, double>>* = 0> void foo() { std::cout << "method 2" << std::endl; } int main() { foo<int>(); …
40 c++  sfinae 

2
เหตุใดสวิตช์จึงไม่ปรับให้เหมาะสมในลักษณะเดียวกับการผูกมัดในกรณีอื่นใน c / c ++
การดำเนินการตามตารางต่อไปนี้จะสร้างชุดของคำสั่ง cmp / je อย่างที่ฉันคาดหวังว่าจะถูกล่ามโซ่หากข้อความ: int square(int num) { if (num == 0){ return 0; } else if (num == 1){ return 1; } else if (num == 2){ return 4; } else if (num == 3){ return 9; } else if (num == 4){ return 16; } else if …

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
วิธีการเปรียบเทียบลายเซ็นของทั้งสองฟังก์ชั่น?
มีวิธีการตรวจสอบว่าทั้งสองฟังก์ชั่นมีลายเซ็นเหมือนกันหรือไม่? ตัวอย่างเช่น: int funA (int a, int b); int funB (int a, int b); float funC (int a, int b); int funD (float a, int b); ในตัวอย่างนี้funAและเป็นชุดเดียวของฟังก์ชั่นที่ควรจะกลับfunBtrue

2
วิธีการเริ่มต้น C ++ 17 เวกเตอร์ของคู่ด้วยองค์ประกอบเสริม
ใน C ++ 17 คุณจะประกาศและกำหนดค่าเริ่มต้นเวกเตอร์ของคู่ (หรือ tuples) ด้วยองค์ประกอบเสริมได้อย่างไร std::vector<std::pair<int, optional<bool> > > vec1 = { {1, true}, {2, false}, {3, nullptr}}; ฉันมีคู่ที่องค์ประกอบที่สองอาจเป็นโมฆะ / ไม่จำเป็น

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
การเพิ่มตัวชี้ไปยังอาร์เรย์ไดนามิกขนาด 0 ไม่ได้กำหนดไว้หรือไม่
AFAIK แม้ว่าเราจะไม่สามารถสร้างอาร์เรย์หน่วยความจำคงที่ขนาด 0 แต่เราสามารถทำได้ด้วยไดนามิก: int a[0]{}; // Compile-time error int* p = new int[0]; // Is well-defined อย่างที่ฉันได้อ่านpทำหน้าที่เหมือนองค์ประกอบสุดท้ายที่จบแล้ว ฉันสามารถพิมพ์ที่อยู่ที่pชี้ไปได้ if(p) cout << p << endl; แม้ว่าฉันจะแน่ใจว่าเราไม่สามารถอ้างถึงตัวชี้ (องค์ประกอบสุดท้ายที่ผ่านมา) เนื่องจากเราไม่สามารถใช้ตัววนซ้ำ (องค์ประกอบที่ผ่านมา) แต่สิ่งที่ฉันไม่แน่ใจคือการเพิ่มตัวชี้นั้นpหรือไม่ พฤติกรรมที่ไม่ได้กำหนด (UB) เหมือนกับตัววนซ้ำหรือไม่ p++; // UB?

2
การจัดสรรตัวชี้ใหม่ให้ทำงานนั้นถูกกฎหมายหรือไม่
ตัวชี้ไปยังฟังก์ชันไม่ใช่ตัวชี้ข้อมูลธรรมดาเนื่องจากไม่สามารถเก็บไว้ในตัวชี้โมฆะ * อย่างไรก็ตามดูเหมือนว่าฉันสามารถเก็บสำเนาของตัวชี้ฟังก์ชั่นในหน่วยความจำแบบไดนามิก (ใน gcc และเสียงดังกราว) เช่นในรหัสด้านล่าง รหัสดังกล่าวถูกกฎหมายตามมาตรฐาน C ++ หรืออาจเป็นส่วนขยายคอมไพเลอร์บางส่วนหรือไม่ ยิ่งไปกว่านั้นตัวชี้ผลลัพธ์ไปยังฟังก์ชันตัวชี้ทำงานเป็นตัวชี้ข้อมูลธรรมดา: ฉันสามารถเก็บไว้ในโมฆะ * และดึงจากโมฆะ * โดย static_cast พฤติกรรมนี้รับประกันโดยมาตรฐานหรือไม่ int main() { extern void fcn(); void (*fcnPtr)() = &fcn; void (**ptrToFcnPtr)() = nullptr; //Make the copy of fcnPtr on the heap: ptrToFcnPtr = new decltype(fcnPtr)(fcnPtr); //Call the pointed-to function : …
33 c++ 

2
การชนกันของเนมสเปซ C ++ ในตัวสร้างสำเนา
ฉันมีรหัสต่อไปนี้: namespace A { struct Foo { int a; }; } struct Foo { int b; }; struct Bar : public A::Foo { Bar(Foo foo) { c = foo.b; } int c; }; คอมไพเลอร์ C ++ บ่นที่ "c = foo.b" เนื่องจาก A :: Foo ไม่มีสมาชิกชื่อ b ถ้าฉันเปลี่ยนประเภทของพารามิเตอร์ Bar ด้วย :: …

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