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

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

1
เสียงดังกราวไม่ได้รวบรวมรหัส แต่ gcc และ msvc รวบรวมไว้
ฉันไม่เข้าใจว่ามีปัญหาอะไร: ในโค้ดของฉันหรือในคอมไพเลอร์ (น้อยกว่านั้นเป็นไปได้) มีชิ้นส่วนของรหัสเช่นนี้: #include <iostream> #include <type_traits> #include <set> template<typename T, typename = void> struct TestA: std::false_type {}; template<typename T> struct TestA<T, std::void_t<typename T::reverse_iterator>> : std::true_type {}; template<typename T> struct TestA<T, std::void_t<typename T::dummy_iterator>> : std::true_type {}; int main() { std::cout << TestA<std::set<int>>::value; } ทั้ง GCC และ MSVC รวบรวมมัน ผมทดสอบบน …

2
อะไรคือจุดในการรู้ว่าวัตถุนั้นเป็นส่วนประกอบหรือไม่หรือเป็นประเภทของชั้นเรียนหรือไม่?
สวัสดีฉันเคยเห็นตัวอย่างมากมายใน Cppreference.com: std::is_class<T> std::is_integral และอื่น ๆ ฉันรู้ว่าถ้าผมเรียกใช้รหัสเช่นฉันจะได้รับหรือtrue falseแต่ประเด็นคืออะไร เช่นรู้ว่าวัตถุเป็นประเภทของชั้นเรียนหรือไม่? #include <iostream> #include <type_traits> struct A {}; class B {}; enum class C {}; int main() { std::cout << std::boolalpha; std::cout << std::is_class<A>::value << '\n'; std::cout << std::is_class<B>::value << '\n'; std::cout << std::is_class<C>::value << '\n'; std::cout << std::is_class<int>::value << '\n'; } …
14 c++  templates 

3
ฟังก์ชั่นแม่แบบไม่ทำงานสำหรับตัวชี้ไปยังสมาชิกฟังก์ชั่นการอ้างอิง const
เมื่อเร็ว ๆ นี้ฉันได้เขียนฟังก์ชั่นเทมเพลตเพื่อแก้ปัญหาการทำซ้ำรหัสบางอย่าง ดูเหมือนว่านี้: template<class T, class R, class... Args> R call_or_throw(const std::weak_ptr<T>& ptr, const std::string& error, R (T::*fun)(Args...), Args... args) { if (auto sp = ptr.lock()) { return std::invoke(fun, *sp, args...); } else { throw std::runtime_error(error.c_str()); } } int main() { auto a = std::make_shared<A>(); call_or_throw(std::weak_ptr<A>(a), "err", &A::foo, 1); …
14 c++  templates 

1
ปัญหาคอมไพเลอร์ C ++ พร้อมโครงสร้างในคลาสเทมเพลต
รหัสต่อไปนี้ไม่ได้รวบรวมกับ gcc หรือเสียงดังกราว template<class T> class foo{}; template<class T> class template_class_with_struct { void my_method() { if(this->b.foo < 1); }; struct bar { long foo; } b; }; ข้อความแสดงข้อผิดพลาดคือ error: type/value mismatch at argument 1 in template parameter list for 'template<class T> class foo' 8 | if(this->b.foo < 1); ข้อผิดพลาดเกิดจากคลาส templat …

3
ดำเนินการฟังก์ชันภายในเทมเพลตฟังก์ชันเฉพาะสำหรับประเภทที่มีฟังก์ชันกำหนดไว้เท่านั้น
ฉันมีเทมเพลตฟังก์ชั่นที่ใช้หลายประเภทเนื่องจากอินพุต มีเพียงหนึ่งประเภทเท่านั้นที่มีgetInt()ฟังก์ชัน ดังนั้นฉันต้องการรหัสเพื่อเรียกใช้ฟังก์ชันเฉพาะสำหรับประเภทนั้น กรุณาแนะนำวิธีแก้ปัญหา ขอบคุณ #include <type_traits> #include <typeinfo> class X { public: int getInt(){ return 9; } }; class Y{ }; template<typename T> void f(T& v){ // error: 'class Y' has no member named 'getInt' // also tried std::is_same<T, X>::value if(typeid(T).name() == typeid(X).name()){ int i = v.getInt();// I want …

6
วิธีเปรียบเทียบ struct ทั่วไปใน C ++?
ฉันต้องการเปรียบเทียบ structs ด้วยวิธีทั่วไปและฉันทำบางสิ่งเช่นนี้ (ฉันไม่สามารถแบ่งปันแหล่งที่มาจริงได้ดังนั้นขอรายละเอียดเพิ่มเติมหากจำเป็น): template<typename Data> bool structCmp(Data data1, Data data2) { void* dataStart1 = (std::uint8_t*)&data1; void* dataStart2 = (std::uint8_t*)&data2; return memcmp(dataStart1, dataStart2, sizeof(Data)) == 0; } ส่วนใหญ่ใช้งานได้ตามที่ตั้งใจยกเว้นบางครั้งมันจะคืนค่าเท็จแม้ว่าอินสแตนซ์ของ struct สองรายการมีสมาชิกเหมือนกัน หลังจากค้นหาบางฉันพบว่าmemcmpสามารถล้มเหลวเนื่องจากโครงสร้างที่ใช้เป็นเบาะ มีวิธีที่เหมาะสมกว่าในการเปรียบเทียบหน่วยความจำที่ไม่แยแสกับการขยายหรือไม่ ฉันไม่สามารถแก้ไข structs ที่ใช้ (พวกเขาเป็นส่วนหนึ่งของ API ที่ฉันใช้) และ structs ที่แตกต่างกันจำนวนมากที่ใช้มีสมาชิกที่แตกต่างกันและดังนั้นจึงไม่สามารถเปรียบเทียบเป็นรายบุคคลในแบบทั่วไป (กับความรู้ของฉัน) แก้ไข: ฉันโชคไม่ดีติดอยู่กับ C ++ 11 ควรพูดถึงเรื่องนี้ก่อนหน้านี้ ...

2
ถ้า constexpr ที่มี static_assert ในแลมบ์ดาคอมไพเลอร์ตัวไหนถูกต้อง?
เมื่อเราต้องการที่จะใช้static_assertในif constexprเราจะต้องทำให้เงื่อนไขขึ้นอยู่กับพารามิเตอร์แม่แบบบางอย่าง น่าสนใจ gcc และเสียงดังกราวไม่เห็นด้วยเมื่อโค้ดถูกห่อในแลมบ์ดา โค้ดต่อไปนี้คอมไพล์ด้วย gcc แต่เสียงดังกราวกระตุ้นการยืนยันแม้ว่าif constexprจะไม่เป็นจริงก็ตาม #include <utility> template<typename T> constexpr std::false_type False; template<typename T> void foo() { auto f = [](auto x) { constexpr int val = decltype(x)::value; if constexpr(val < 0) { static_assert(False<T>, "AAA"); } }; f(std::integral_constant<int, 1>{}); } int main() { foo<int>(); } ตัวอย่างที่อาศัยอยู่ที่นี่ …

1
C ++ 20 การกำหนดนอกคลาสในเทมเพลตคลาส
จนถึงมาตรฐาน C ++ 20 ของ C ++ เมื่อเราต้องการกำหนดโอเปอเรเตอร์นอกคลาสซึ่งใช้สมาชิกส่วนตัวของคลาสเทมเพลตเราจะใช้โครงสร้างที่คล้ายกับสิ่งนี้: template <typename T> class Foo; template <typename T> constexpr bool operator==(T lhs, const Foo<T>& rhs); template <typename T> class Foo { public: constexpr Foo(T k) : mK(k) {} constexpr friend bool operator==<T>(T lhs, const Foo& rhs); private: T mK; }; template <typename …
12 c++  templates  c++20 

2
ผ่านแนวคิดไปยังฟังก์ชั่น
เนื่องจากแนวคิดถูกกำหนดให้เป็นเพรดิเคตเวลาคอมไพล์จึงเป็นไปได้หรือไม่ที่จะใช้เพรดิเคตเหล่านี้ซ้ำสำหรับอัลกอริธึมเวลารวบรวม เช่นเป็นไปได้ไหมที่จะตรวจสอบว่าทุกประเภทใน tuple สอดคล้องกับแนวคิดหรือไม่? เท่าที่ฉันได้เห็นมันเป็นไปไม่ได้ที่จะส่งแนวคิดไปยังฟังก์ชั่นในทางใดทางหนึ่งซึ่งทำให้ฉันกลับไปใช้แม่แบบสำหรับกรณีเหล่านี้ #include <type_traits> template<typename T> concept FloatLike = std::is_same_v<T, float>; struct IsFloat { template<typename U> constexpr static bool test() { return FloatLike<U>; } }; template<typename Predicate, typename... T> constexpr bool all_types() { return (Predicate::template test<T>() && ...); } int main() { static_assert(all_types<IsFloat, float, float>()); static_assert(!all_types<IsFloat, float, …

1
ทำไมรหัสนี้ใช้เวลานานในการคอมไพล์ด้วย g ++
พิจารณารหัสต่อไปนี้: template<int i> class A { typedef A<i-1> B; B x, y; }; template<> class A<0> { char m; }; int main() { A<LEVEL> a; } เมื่อทำการเปรียบเทียบการคอมไพล์ด้วย g ++ โดยคำสั่ง Bash ต่อไปนี้ (ด้วย g ++ 8.3.0) for ((level=1; level<30; ++level)); do echo -n ${level}, /usr/bin/time -f %U g++ -DLEVEL=$level test.cpp …

1
เทมเพลตตัวแปรสามารถส่งผ่านเป็นอาร์กิวเมนต์เท็มเพลตเทมเพลตได้หรือไม่
ตัวอย่างที่ไร้สาระดังต่อไปนี้ไม่ได้รวบรวม แต่มีวิธีอื่นในการส่งแม่แบบตัวแปรเป็นอาร์กิวเมนต์แม่แบบแม่แบบหรือไม่ template<typename T> constexpr auto zero = T{0}; template<typename T, template<typename> auto VariableTemplate> constexpr auto add_one() { return VariableTemplate<T> + T{1}; } int main() { return add_one<int, zero>(); } ลองใช้ Compiler Explorer

2
การลดชนิดอาร์กิวเมนต์เท็มเพลตเทมเพลต C ++
ฉันมีรหัสที่ค้นหาและพิมพ์การจับคู่ของรูปแบบเหมือนกับการข้ามคอนเทนเนอร์ของสตริง ทำการพิมพ์ในฟังก์ชั่นfooที่เทมเพลต รหัส #include <iostream> #include <algorithm> #include <iterator> #include <vector> #include <string> #include <tuple> #include <utility> template<typename Iterator, template<typename> class Container> void foo(Iterator first, Container<std::pair<Iterator, Iterator>> const &findings) { for (auto const &finding : findings) { std::cout << "pos = " << std::distance(first, finding.first) << " "; std::copy(finding.first, finding.second, …

1
ปัญหาใน GCC / C ++ 17 พร้อมคลาสเทมเพลตเทมเพลต
พิจารณาโอเวอร์โหลด 2 ตัวต่อไปนี้ template<typename T> bool test() { return true; } template<template<typename ...> class T> bool test() { return false; } อันที่หนึ่งใช้ได้กับคลาสปกติขณะที่อันที่สองใช้ได้กับเทมเพลตที่ไม่ได้สร้างอินสแตนซ์ ตัวอย่างเช่น std::cout<<test<int>()<<std::endl; <-- this yields 1 std::cout<<test<std::list>()<<std::endl; <--this yields 0 ตอนนี้ให้พิจารณาฟังก์ชั่นเทมเพลตต่อไปนี้: template<typename U> bool templfun(){ struct A{ bool f(){ return test<A>(); // <-- this gives an error } …
10 c++  templates  gcc  clang  c++17 

2
การหักอาร์กิวเมนต์เทมเพลตสำหรับอาร์กิวเมนต์ของประเภทฟังก์ชั่น
พิจารณาโปรแกรมต่อไปนี้ #include <iostream> template <typename T> void f( void ( *fn )( T ) ) { fn( 42 ); } void g( int x ) { std::cout << "g( " << x << " );\n"; } int main() { f( g ); } โปรแกรมคอมไพล์ได้สำเร็จและผลลัพธ์คือ g( 42 ); ตอนนี้ขอเปลี่ยนชื่อฟังก์ชั่นที่ไม่ใช่แม่แบบเพื่อgf #include <iostream> …

3
เหตุใดจึงไม่จำเป็นต้องใช้ชื่อพิมพ์สำหรับประเภทที่อ้างอิงในกรณีต่อไปนี้
ผมได้อ่านเกี่ยวกับการลบการอ้างอิงจากประเภทที่นี่ มันให้ตัวอย่างต่อไปนี้: #include <iostream> // std::cout #include <type_traits> // std::is_same template<class T1, class T2> void print_is_same() { std::cout << std::is_same<T1, T2>() << '\n'; } int main() { std::cout << std::boolalpha; print_is_same<int, int>(); print_is_same<int, int &>(); print_is_same<int, int &&>(); print_is_same<int, std::remove_reference<int>::type>(); // Why not typename std::remove_reference<int>::type ? print_is_same<int, std::remove_reference<int &>::type>();// Why …

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