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

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

13
เป็นไปได้หรือไม่ที่จะกำหนดจำนวนองค์ประกอบของคลาส c ++ enum
เป็นไปได้หรือไม่ที่จะกำหนดจำนวนสมาชิกของ c ++ enum class : enum class Example { A, B, C, D, E }; ฉันพยายามที่จะใช้ sizeofอย่างไรก็ตามมันส่งคืนขนาดขององค์ประกอบ enum sizeof(Example); // Returns 4 (on my architecture) มีวิธีมาตรฐานในการรับคาร์ดินาลลิตี้ (5 ในตัวอย่างของฉัน) หรือไม่

6
จะตรวจสอบได้อย่างไรว่าเธรด std :: ยังทำงานอยู่หรือไม่
ฉันจะตรวจสอบได้อย่างไรว่า a std::threadยังทำงานอยู่ (ในรูปแบบที่ไม่ขึ้นกับแพลตฟอร์ม) มันขาดtimed_join()วิธีการและjoinable()ไม่มีความหมายสำหรับสิ่งนั้น ฉันคิดว่าจะล็อค mutex ด้วยstd::lock_guardเธรดและใช้try_lock()วิธีการของ mutex เพื่อตรวจสอบว่ามันยังคงถูกล็อกอยู่หรือไม่ (เธรดกำลังทำงานอยู่) แต่ดูเหมือนว่าฉันจะซับซ้อนโดยไม่จำเป็น คุณรู้วิธีที่หรูหรากว่านี้หรือไม่? อัปเดต:เพื่อความชัดเจน: ฉันต้องการตรวจสอบว่าเธรดออกอย่างสมบูรณ์หรือไม่ ถือว่าด้าย 'ห้อย' ทำงานเพื่อจุดประสงค์นี้

4
C ++ 11 ตัวแปร thread_local คงที่โดยอัตโนมัติหรือไม่
มีความแตกต่างระหว่างส่วนรหัสทั้งสองนี้หรือไม่: void f() { thread_local vector<int> V; V.clear(); ... // use V as a temporary variable } และ void f() { static thread_local vector<int> V; V.clear(); ... // use V as a temporary variable } Backstory: เดิมทีฉันมีเวกเตอร์ STATIC V (สำหรับการเก็บค่ากลางบางค่ามันจะถูกล้างทุกครั้งที่ฉันเข้าสู่ฟังก์ชัน) และโปรแกรมเธรดเดียว ฉันต้องการเปลี่ยนโปรแกรมให้เป็นโปรแกรมมัลติเธรดดังนั้นฉันต้องกำจัดตัวปรับคงที่นี้ออกไป ความคิดของฉันคือเปลี่ยนค่าคงที่ทั้งหมดให้เป็น thread_local และไม่ต้องกังวลกับสิ่งอื่นใด วิธีนี้สามารถย้อนกลับได้หรือไม่?

1
การเข้ารหัส Unicode สำหรับตัวอักษรสตริงใน C ++ 11
จากคำถามที่เกี่ยวข้องฉันต้องการถามเกี่ยวกับอักขระใหม่และประเภทลิเทอรัลสตริงใน C ++ 11 ดูเหมือนว่าตอนนี้เรามีอักขระสี่ประเภทและตัวอักษรสตริงห้าประเภท ประเภทอักขระ: char a = '\x30'; // character, no semantics wchar_t b = L'\xFFEF'; // wide character, no semantics char16_t c = u'\u00F6'; // 16-bit, assumed UTF16? char32_t d = U'\U0010FFFF'; // 32-bit, assumed UCS-4 และตัวอักษรสตริง: char A[] = "Hello\x0A"; // byte string, "narrow encoding" wchar_t …

6
ต้องการตัววนซ้ำเมื่อใช้ ranged-based สำหรับลูป
ขณะนี้ฉันสามารถทำลูปตามระยะห่างได้เท่านั้น: for (auto& value : values) แต่บางครั้งฉันต้องการตัววนซ้ำค่าแทนการอ้างอิง (ไม่ว่าด้วยเหตุผลใดก็ตาม) มีวิธีใดบ้างที่ไม่ต้องผ่านเวกเตอร์เปรียบเทียบค่าทั้งหมด?
85 c++  c++11  for-loop  iterator 

1
C ++ 11 make_pair พร้อมพารามิเตอร์เทมเพลตที่ระบุจะไม่คอมไพล์
ฉันเพิ่งเล่นกับ g ++ 4.7 (หนึ่งในสแน็ปช็อตในภายหลัง) ที่เปิดใช้งาน -std = c ++ 11 ฉันพยายามรวบรวมฐานรหัสที่มีอยู่บางส่วนและมีกรณีหนึ่งที่ล้มเหลวค่อนข้างทำให้ฉันสับสน ฉันจะขอบคุณถ้ามีใครสามารถอธิบายสิ่งที่เกิดขึ้นได้ นี่คือรหัส: #include <utility> #include <iostream> #include <vector> #include <string> int main ( ) { std::string s = "abc"; // 1 ok std::pair < std::string, int > a = std::make_pair ( s, 7 ); // 2 error on …

5
Enum vs enum พิมพ์อย่างมาก
ฉันเป็นมือใหม่ในการเขียนโปรแกรม C ++ วันนี้ผมเจอกระทู้ใหม่: enumขอพิมพ์ ฉันได้ค้นคว้าข้อมูลมาบ้างแล้ว แต่จนถึงตอนนี้ฉันยังไม่สามารถหาคำตอบได้ว่าทำไมเราถึงต้องการสิ่งนี้และอะไรคือสิ่งที่ใช้เหมือนกัน? ตัวอย่างเช่นหากเรามี: enum xyz{a, b, c}; /*a = 0, b = 1, c = 2, (Typical C format)*/ ทำไมเราต้องเขียน: enum class xyz{a, b, c}; เรากำลังพยายามทำอะไรที่นี่? ข้อสงสัยที่สำคัญที่สุดของฉันคือวิธีการใช้งาน คุณช่วยยกตัวอย่างเล็กน้อยซึ่งจะทำให้ฉันเข้าใจ
84 c++  c++11  enums 

10
ใช้ std :: vector เป็นมุมมองในหน่วยความจำดิบ
ฉันใช้ไลบรารี่ภายนอกซึ่งในบางครั้งจะให้ตัวชี้แบบดิบแก่อาร์เรย์ของจำนวนเต็มและขนาด ตอนนี้ฉันต้องการที่จะใช้std::vectorในการเข้าถึงและแก้ไขค่าเหล่านี้ในสถานที่แทนที่จะเข้าถึงพวกเขาด้วยตัวชี้แบบดิบ นี่คือตัวอย่าง articifial ที่อธิบายถึงจุด: size_t size = 0; int * data = get_data_from_library(size); // raw data from library {5,3,2,1,4}, size gets filled in std::vector<int> v = ????; // pseudo vector to be used to access the raw data std::sort(v.begin(), v.end()); // sort raw data in place for (int i …
71 c++  c++11  vector  stdvector 

5
วิธีรับแอดเดรสของฟังก์ชันแลมบ์ดา C ++ ภายในแลมบ์ดาเองได้อย่างไร
ฉันกำลังพยายามหาวิธีรับที่อยู่ของฟังก์ชันแลมบ์ดาภายในตัวเอง นี่คือตัวอย่างรหัส: []() { std::cout << "Address of this lambda function is => " << ???? }(); ฉันรู้ว่าฉันสามารถจับแลมบ์ดาในตัวแปรและพิมพ์ที่อยู่ได้ แต่ฉันต้องการทำสิ่งนี้เมื่อฟังก์ชันที่ไม่ระบุตัวตนกำลังดำเนินการ มีวิธีที่ง่ายกว่านี้หรือไม่?
53 c++  c++11  lambda  c++14  c++17 

3
C ++ decltype และวงเล็บ - ทำไม
มีการพูดถึง เรื่องนี้มาก่อนแต่นี่ไม่ได้ซ้ำกัน เมื่อมีคนถามถึงความแตกต่างระหว่างdecltype(a)และdecltype((a))คำตอบปกติคือ - aเป็นตัวแปร(a)คือการแสดงออก ฉันพบคำตอบนี้ไม่พอใจ อย่างแรกaคือการแสดงออกเช่นกัน ตัวเลือกสำหรับการแสดงออกหลักได้แก่ หมู่คนอื่น ๆ - (นิพจน์) ID-แสดงออก ที่สำคัญกว่านั้นการใช้ถ้อยคำสำหรับเดคไทป์จะพิจารณาวงเล็บอย่างชัดเจนมาก : For an expression e, the type denoted by decltype(e) is defined as follows: (1.1) if e is an unparenthesized id-expression naming a structured binding, ... (1.2) otherwise, if e is an unparenthesized id-expression naming a …

6
การสลับเวกเตอร์สองตัวที่แตกต่างกันใน C ++ ใช้วิธี std :: vector :: swap ปลอดภัยหรือไม่?
สมมติว่าคุณมีรหัสต่อไปนี้: #include <iostream> #include <string> #include <vector> int main() { std::vector<std::string> First{"example", "second" , "C++" , "Hello world" }; std::vector<std::string> Second{"Hello"}; First.swap(Second); for(auto a : Second) std::cout << a << "\n"; return 0; } ลองนึกภาพเวกเตอร์ไม่ใช่std::stringยังคลาส: std::vector<Widget> WidgetVector; std::vector<Widget2> Widget2Vector; มันปลอดภัยไหมที่จะสลับสองเวกเตอร์ด้วยstd::vector::swapวิธีการ: WidgetVector.swap(Widget2Vector);หรือมันจะนำไปสู่ ​​UB?
30 c++  c++11  vector  stdvector  swap 

3
ฉันจะป้องกันไม่ให้ C ++ คาดเดาอาร์กิวเมนต์เท็มเพลตที่สองได้อย่างไร
ฉันใช้ไลบรารี่ C ++ ( strf ) ซึ่งบางที่อยู่ภายในนั้นมีรหัสต่อไปนี้: namespace strf { template <typename ForwardIt> inline auto range(ForwardIt begin, ForwardIt end) { /* ... */ } template <typename Range, typename CharT> inline auto range(const Range& range, const CharT* sep) { /* ... */ } } ตอนนี้ฉันต้องการใช้strf::range<const char*>(some_char_ptr, some_char_ptr + some_length)ในรหัสของฉัน แต่ถ้าฉันทำฉันได้รับข้อผิดพลาดต่อไปนี้ (ด้วย …

2
วิธีตรวจสอบว่ามีการกำหนดจำนวนเต็มความกว้างคงที่หรือไม่
ใน C ++ จำนวนเต็มความกว้างคงที่ถูกกำหนดเป็นทางเลือกแต่ฉันไม่สามารถหาวิธีที่แนะนำในการตรวจสอบว่ามีการกำหนดจริงหรือไม่ อะไรเป็นวิธีแบบพกพาในการตรวจสอบว่ามีจำนวนเต็มความกว้างคงที่หรือไม่
25 c++  c++11  types  stdint  cstdint 

3
ความแตกต่างของพฤติกรรมของฟังก์ชั่นแลมบ์ดาที่จับได้ไม่แน่นอนจากการอ้างอิงถึงตัวแปรทั่วโลก
ฉันพบว่าผลลัพธ์นั้นแตกต่างกันในคอมไพเลอร์ถ้าฉันใช้แลมบ์ดาเพื่อจับการอ้างอิงไปยังตัวแปรทั่วโลกด้วยคำสำคัญที่ไม่แน่นอนและปรับเปลี่ยนค่าในฟังก์ชั่นแลมบ์ดา #include <stdio.h> #include <functional> int n = 100; std::function<int()> f() { int &m = n; return [m] () mutable -> int { m += 123; return m; }; } int main() { int x = n; int y = f()(); int z = n; printf("%d %d %d\n", x, y, …

2
เอ็นจิ้นตัวเลขสุ่มของ <random> ใดที่ควรใช้ในทางปฏิบัติจริง ๆ มาตรฐาน :: mt19937?
สมมติว่าคุณต้องการใช้&lt;random&gt;สิ่งอำนวยความสะดวกC ++ ในโปรแกรมที่ใช้งานจริง (สำหรับคำจำกัดความของ "การปฏิบัติ" บางข้อ จำกัด ที่นี่เป็นส่วนหนึ่งของคำถามนี้) คุณได้รับรหัสคร่าว ๆ เช่นนี้: int main(int argc, char **argv) { int seed = get_user_provided_seed_value(argc, argv); if (seed == 0) seed = std::random_device()(); ENGINE g(seed); // TODO: proper seeding? go_on_and_use(g); } คำถามของฉันคือคุณควรใช้แบบENGINEไหน ฉันเคยพูดเสมอstd::mt19937เพราะมันพิมพ์ได้อย่างรวดเร็วและมีการจดจำชื่อ แต่ทุกวันนี้ดูเหมือนว่าทุกคนกำลังพูดว่า Mersenne Twister นั้นหนักและแคชไม่เป็นมิตรและไม่ผ่านการทดสอบทางสถิติทั้งหมดที่คนอื่นทำ ฉันต้องการพูดstd::default_random_engineเพราะเป็น "ค่าเริ่มต้น" ที่ชัดเจน แต่ฉันไม่รู้ว่ามันแตกต่างจากแพลตฟอร์มหนึ่งไปอีกแพลตฟอร์มหรือไม่และฉันไม่รู้ว่ามันดีทางสถิติหรือไม่ เนื่องจากทุกคนอยู่บนแพลตฟอร์ม 64 บิตวันนี้อย่างน้อยเราควรจะใช้std::mt19937_64มากกว่าstd::mt19937หรือไม่ …
21 c++  c++11  random 

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