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

ใช้แท็กนี้สำหรับรหัสที่ต้องคอมไพล์เป็น C ++ 11 (ไม่ใช้ฟีเจอร์ที่แนะนำใน C ++ 14 หรือใหม่กว่า)

5
ใช้เทมเพลตภายนอก (C ++ 11)
รูปที่ 1: เทมเพลตฟังก์ชัน TemplHeader.h template<typename T> void f(); TemplCpp.cpp template<typename T> void f(){ //... } //explicit instantation template void f<T>(); main.cpp #include "TemplHeader.h" extern template void f<T>(); //is this correct? int main() { f<char>(); return 0; } นี่เป็นวิธีใช้ที่ถูกต้องextern templateหรือฉันใช้คีย์เวิร์ดนี้เฉพาะกับเทมเพลตคลาสดังรูปที่ 2 รูปที่ 2: เทมเพลตคลาส TemplHeader.h template<typename T> class foo { T …
116 c++  templates  c++11  extern 

1
const หมายถึง thread-safe ใน C ++ 11 หรือไม่?
ผมได้ยินว่าconstหมายถึงด้ายปลอดภัยในC ++ 11 เป็นเช่นนั้นจริงหรือ? หมายความว่าconstตอนนี้เทียบเท่าของJava 's synchronized? พวกเขาใช้คีย์เวิร์ดหมดหรือไม่

4
หลีกเลี่ยงคำสั่ง if ภายใน for loop หรือไม่?
ฉันมีคลาสที่เรียกWriterว่ามีฟังก์ชันwriteVectorดังนี้: void Drawer::writeVector(vector<T> vec, bool index=true) { for (unsigned int i = 0; i < vec.size(); i++) { if (index) { cout << i << "\t"; } cout << vec[i] << "\n"; } } ฉันพยายามไม่ให้มีรหัสซ้ำในขณะที่ยังคงกังวลเกี่ยวกับประสิทธิภาพ ในฟังก์ชั่นฉันทำการif (index)ตรวจสอบทุกรอบของfor-loop แม้ว่าผลลัพธ์จะเหมือนกันเสมอ ซึ่งถือเป็นการ "กังวลเกี่ยวกับประสิทธิภาพการทำงาน" ฉันสามารถหลีกเลี่ยงสิ่งนี้ได้อย่างง่ายดายโดยวางเช็คไว้ด้านนอกfor-loop ของฉัน อย่างไรก็ตามฉันจะได้รับรหัสซ้ำมากมาย: void Drawer::writeVector(...) { if (index) { for …


3
ข้อดีของการใช้การอ้างอิงการส่งต่อแบบอิงตามช่วงสำหรับลูปคืออะไร?
const auto&จะเพียงพอถ้าฉันต้องการดำเนินการอ่านอย่างเดียว อย่างไรก็ตามฉันได้ชน for (auto&& e : v) // v is non-const สองสามครั้งเมื่อเร็ว ๆ นี้ สิ่งนี้ทำให้ฉันสงสัย: เป็นไปได้ไหมว่าในบางกรณีมุมที่คลุมเครือมีประโยชน์ด้านประสิทธิภาพในการใช้การอ้างอิงการส่งต่อเมื่อเทียบกับauto&หรือconst auto&? ( shared_ptrเป็นผู้ต้องสงสัยคดีมุมอับ) อัปเดต สองตัวอย่างที่ฉันพบในรายการโปรดของฉัน: ข้อเสียของการใช้การอ้างอิง const เมื่อทำซ้ำในประเภทพื้นฐานหรือไม่? ฉันสามารถทำซ้ำค่าของแผนที่โดยใช้ range-based for loop ได้หรือไม่? โปรดตั้งสมาธิกับคำถาม: เหตุใดฉันจึงต้องการใช้ auto && แบบอิงตามช่วงสำหรับลูป

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 ++ หรือไม่ว่าใน C ++ 11 unordered_map ทำลายสิ่งที่แทรก?
ฉันเพิ่งเสียชีวิตไปสามวันในการติดตามข้อผิดพลาดที่แปลกมากที่ unordered_map :: insert () ทำลายตัวแปรที่คุณแทรก ลักษณะการทำงานที่ไม่ชัดเจนนี้เกิดขึ้นในคอมไพเลอร์ล่าสุดเท่านั้น: ฉันพบว่า clang 3.2-3.4 และ GCC 4.8 เป็นคอมไพเลอร์เพียงตัวเดียวที่แสดง "คุณลักษณะ" นี้ นี่คือโค้ดที่ลดลงบางส่วนจากฐานรหัสหลักของฉันซึ่งแสดงให้เห็นถึงปัญหา: #include <memory> #include <unordered_map> #include <iostream> int main(void) { std::unordered_map<int, std::shared_ptr<int>> map; auto a(std::make_pair(5, std::make_shared<int>(5))); std::cout << "a.second is " << a.second.get() << std::endl; map.insert(a); // Note we are NOT doing insert(std::move(a)) std::cout …
114 c++  gcc  c++11  clang  standards 

6
ฉันจะเขียน bit-mask ที่บำรุงรักษาได้รวดเร็วและคอมไพล์ไทม์ใน C ++ ได้อย่างไร
ฉันมีรหัสที่มากกว่าหรือน้อยกว่านี้: #include <bitset> enum Flags { A = 1, B = 2, C = 3, D = 5, E = 8, F = 13, G = 21, H, I, J, K, L, M, N, O }; void apply_known_mask(std::bitset<64> &bits) { const Flags important_bits[] = { B, D, E, H, K, …

9
อะไรคือวิธีที่ดีที่สุดในการทำซ้ำสองคอนเทนเนอร์ขึ้นไปพร้อมกัน
C ++ 11 มีหลายวิธีในการวนซ้ำบนคอนเทนเนอร์ ตัวอย่างเช่น: ลูปตามช่วง for(auto c : container) fun(c) มาตรฐาน :: for_each for_each(container.begin(),container.end(),fun) อย่างไรก็ตามวิธีที่แนะนำในการทำซ้ำสองคอนเทนเนอร์ (หรือมากกว่า) ที่มีขนาดเท่ากันเพื่อทำสิ่งต่างๆเช่น: for(unsigned i = 0; i < containerA.size(); ++i) { containerA[i] = containerB[i]; }

20
คุณจะทำซ้ำองค์ประกอบของ std :: tuple ได้อย่างไร
ฉันจะทำซ้ำบนทูเพิล (โดยใช้ C ++ 11) ได้อย่างไร ฉันลองทำสิ่งต่อไปนี้: for(int i=0; i<std::tuple_size<T...>::value; ++i) std::get<i>(my_tuple).do_sth(); แต่ไม่ได้ผล: ข้อผิดพลาด 1: ขออภัยไม่ได้ใช้งาน: ไม่สามารถขยาย 'Listener ... ' ลงในรายการอาร์กิวเมนต์ที่มีความยาวคงที่ ข้อผิดพลาด 2: ฉันไม่สามารถปรากฏในนิพจน์คงที่ ดังนั้นฉันจะทำซ้ำองค์ประกอบของทูเพิลอย่างถูกต้องได้อย่างไร

8
วิธีการเพาะเมล็ด mt19937 PRNG อย่างกระชับพอเพียงและละเอียด
ดูเหมือนว่าฉันจะเห็นคำตอบมากมายที่มีคนแนะนำให้ใช้<random>เพื่อสร้างตัวเลขสุ่มโดยปกติจะมีโค้ดดังนี้: std::random_device rd; std::mt19937 gen(rd()); std::uniform_int_distribution<> dis(0, 5); dis(gen); โดยปกติสิ่งนี้จะแทนที่ "สิ่งที่น่าสะอิดสะเอียน" บางประเภทเช่น: srand(time(NULL)); rand()%6; เราอาจวิพากษ์วิจารณ์วิธีการเดิมโดยการโต้เถียงว่าtime(NULL)ให้เอนโทรปีต่ำtime(NULL)สามารถคาดเดาได้และผลลัพธ์สุดท้ายก็ไม่เหมือนกัน แต่ทั้งหมดนี้เป็นความจริงในรูปแบบใหม่: มีเพียงแผ่นไม้อัดที่เงางามกว่า rd()ส่งกลับไฟล์unsigned int. สิ่งนี้มีอย่างน้อย 16 บิตและอาจเป็น 32 บิตนั่นไม่เพียงพอที่จะเริ่มต้นสถานะ 19937 บิตของ MT การใช้std::mt19937 gen(rd());gen()(การเพาะด้วย 32 บิตและดูที่ผลลัพธ์แรก) ไม่ได้ให้การกระจายเอาต์พุตที่ดี 7 และ 13 ไม่สามารถเป็นเอาต์พุตแรกได้ สองเมล็ดผลิต 0. สิบสองเมล็ดผลิต 1226181350. ( Link ) std::random_deviceอาจเป็นได้และบางครั้งก็ใช้เป็น PRNG แบบธรรมดาที่มีเมล็ดพันธุ์คงที่ ดังนั้นจึงอาจสร้างลำดับเดียวกันในทุกครั้ง ( เชื่อมโยง ) …
113 c++  c++11  random 

4
คลาส enum สามารถแปลงเป็นประเภทพื้นฐานได้หรือไม่
มีวิธีการแปลงenum classฟิลด์เป็นชนิดพื้นฐานหรือไม่? ฉันคิดว่านี่จะเป็นไปโดยอัตโนมัติ แต่ดูเหมือนจะไม่ใช่ enum class my_fields : unsigned { field = 1 }; unsigned a = my_fields::field; GCC ปฏิเสธงานนั้น error: cannot convert 'my_fields' to 'unsigned int' in assignment.
113 c++  c++11 

6
เหตุใดเราจึงใช้ "std :: move" บนวัตถุ "const" ได้
ใน C ++ 11 เราสามารถเขียนโค้ดนี้: struct Cat { Cat(){} }; const Cat cat; std::move(cat); //this is valid in C++11 เมื่อฉันเรียกstd::moveมันหมายความว่าฉันต้องการย้ายวัตถุกล่าวคือฉันจะเปลี่ยนวัตถุ การย้ายconstวัตถุเป็นเรื่องที่ไม่สมเหตุสมผลเหตุใดจึงstd::moveไม่ จำกัด พฤติกรรมนี้ มันจะเป็นกับดักในอนาคตใช่ไหม? ที่นี่หมายถึงกับดักตามที่ Brandon กล่าวไว้ในความคิดเห็น: "ฉันคิดว่าเขาหมายถึงมัน" กับดัก "เขาส่อเสียดส่อเสียดเพราะถ้าเขาไม่รู้ตัวเขาก็จบลงด้วยการลอกเลียนแบบซึ่งไม่ใช่สิ่งที่เขาตั้งใจไว้" ในหนังสือ 'Effective Modern C ++' โดย Scott Meyers เขายกตัวอย่าง: class Annotation { public: explicit Annotation(const std::string text) : value(std::move(text)) //here …
113 c++  c++11 

4
cout ซิงโครไนซ์ / เธรดปลอดภัยหรือไม่?
โดยทั่วไปฉันถือว่าสตรีมไม่ซิงโครไนซ์ขึ้นอยู่กับผู้ใช้ที่จะทำการล็อกที่เหมาะสม อย่างไรก็ตามสิ่งต่างๆเช่นcoutได้รับการดูแลเป็นพิเศษในไลบรารีมาตรฐานหรือไม่ นั่นคือถ้าหลายเธรดเขียนไปcoutพวกเขาสามารถทำให้coutวัตถุเสียหายได้หรือไม่? ฉันเข้าใจดีว่าแม้ว่าจะซิงโครไนซ์แล้วคุณจะยังคงได้รับเอาต์พุตแบบสอดแทรกแบบสุ่ม แต่รับประกันการแทรกสอด นั่นคือปลอดภัยที่จะใช้coutจากหลายเธรดหรือไม่? ขึ้นอยู่กับผู้ขายรายนี้หรือไม่? gcc ทำอะไร? สำคัญ : โปรดระบุข้อมูลอ้างอิงสำหรับคำตอบของคุณหากคุณตอบว่า "ใช่" เนื่องจากฉันต้องการหลักฐานบางอย่างเกี่ยวกับเรื่องนี้ ข้อกังวลของฉันไม่ได้เกี่ยวกับการเรียกระบบพื้นฐานซึ่งเป็นสิ่งที่ดี แต่สตรีมเพิ่มชั้นของการบัฟเฟอร์ที่ด้านบน
112 c++  gcc  c++11 

13
ฉันจะหลีกเลี่ยง "for" ลูปที่มีเงื่อนไข "if" ภายในด้วย C ++ ได้อย่างไร
ด้วยโค้ดเกือบทั้งหมดที่ฉันเขียนฉันมักจะจัดการกับปัญหาการลดการตั้งค่าในคอลเลกชั่นที่ท้ายที่สุดแล้วมีเงื่อนไข "if" ที่ไร้เดียงสาอยู่ภายใน นี่คือตัวอย่างง่ายๆ: for(int i=0; i<myCollection.size(); i++) { if (myCollection[i] == SOMETHING) { DoStuff(); } } ด้วยภาษาที่ใช้งานได้ฉันสามารถแก้ปัญหาได้โดยการลดคอลเล็กชันลงในคอลเล็กชันอื่น (อย่างง่ายดาย) จากนั้นดำเนินการทั้งหมดกับชุดที่ลดลงของฉัน ใน pseudocode: newCollection <- myCollection where <x=true map DoStuff newCollection และในรูปแบบ C อื่น ๆ เช่น C # ฉันสามารถลดด้วย where clause like foreach (var x in myCollection.Where(c=> c == SOMETHING)) { …
111 c++  c++11  c++14 

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