คำถามติดแท็ก template-argument-deduction

1
คำแนะนำการหักเทมเพลตคืออะไรและเราควรใช้เมื่อใด
มาตรฐาน C ++ 17 แนะนำ "คำแนะนำการหักเทมเพลต" ฉันรวบรวมสิ่งเหล่านี้เกี่ยวกับการหักอาร์กิวเมนต์แม่แบบใหม่สำหรับตัวสร้างที่นำมาใช้ในมาตรฐานเวอร์ชันนี้ แต่ฉันยังไม่เห็นคำอธิบายง่ายๆสไตล์คำถามที่พบบ่อยว่าพวกเขาคืออะไรและมีไว้เพื่ออะไร คำแนะนำการหักเทมเพลตใน C ++ 17 คืออะไร? ทำไม (และเมื่อ) เราต้องการพวกเขา? ฉันจะประกาศได้อย่างไร?

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)ในรหัสของฉัน แต่ถ้าฉันทำฉันได้รับข้อผิดพลาดต่อไปนี้ (ด้วย …

1
ประเภทเทมเพลตและความกำกวมกลับอัตโนมัติ
ฉันมีฟังก์ชั่นเทมเพลตมากเกินไป: template<typename T1, typename T2> auto overMax(T1 a, T2 b) { std::cout << __FUNCSIG__ << std::endl; return b < a ? a : b; } template<typename RT, typename T1, typename T2> RT overMax(T1 a, T2 b) { std::cout << __FUNCSIG__ << std::endl; return b < a ? a : b; …

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