คำถามติดแท็ก template-meta-programming

27
Templated ตรวจสอบการมีอยู่ของฟังก์ชันสมาชิกคลาสหรือไม่
เป็นไปได้ไหมที่จะเขียนเทมเพลตที่เปลี่ยนลักษณะการทำงานขึ้นอยู่กับว่าฟังก์ชั่นสมาชิกบางตัวมีการกำหนดไว้ในคลาสหรือไม่? นี่คือตัวอย่างง่ายๆของสิ่งที่ฉันต้องการเขียน: template<class T> std::string optionalToString(T* obj) { if (FUNCTION_EXISTS(T->toString)) return obj->toString(); else return "toString not defined"; } ดังนั้นหากclass TมีการtoString()กำหนดไว้แล้วมันจะใช้มัน มิฉะนั้นจะไม่ ส่วนมหัศจรรย์ที่ฉันไม่รู้ว่าต้องทำอย่างไรคือส่วน "FUNCTION_EXISTS"

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: ฉันไม่สามารถปรากฏในนิพจน์คงที่ ดังนั้นฉันจะทำซ้ำองค์ประกอบของทูเพิลอย่างถูกต้องได้อย่างไร

15
แม่แบบ C ++ ทัวริงสมบูรณ์?
ฉันบอกว่าระบบเทมเพลตใน C ++ ทัวริงสมบูรณ์ในเวลาคอมไพล์ สิ่งนี้ถูกกล่าวถึงในโพสต์นี้และในวิกิพีเดีย คุณสามารถให้ตัวอย่างการคำนวณที่ใช้ประโยชน์จากคุณสมบัตินี้ได้หรือไม่ ข้อเท็จจริงนี้มีประโยชน์ในทางปฏิบัติหรือไม่?

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); มีวิธีการทำเช่นนี้?

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
ผ่านแนวคิดไปยังฟังก์ชั่น
เนื่องจากแนวคิดถูกกำหนดให้เป็นเพรดิเคตเวลาคอมไพล์จึงเป็นไปได้หรือไม่ที่จะใช้เพรดิเคตเหล่านี้ซ้ำสำหรับอัลกอริธึมเวลารวบรวม เช่นเป็นไปได้ไหมที่จะตรวจสอบว่าทุกประเภทใน 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
ถูกต้องเพื่อเริ่มต้นอาร์เรย์ในตัวสร้าง constexpr หรือไม่
รหัสต่อไปนี้ถูกต้องตามกฎหมายหรือไม่ template <int N> class foo { public: constexpr foo() { for (int i = 0; i < N; ++i) { v_[i] = i; } } private: int v_[N]; }; constexpr foo<5> bar; เสียงดังกังวานยอมรับ แต่ GCC และ MSVC ปฏิเสธมัน ข้อผิดพลาดของ GCC คือ: main.cpp:15:18: error: 'constexpr foo<N>::foo() [with int N = …
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.