boost::lexical_cast ใช้เทมเพลตเพียงประเภทเดียวได้อย่างไร

ฉันได้ตรวจสอบความยุ่งเหยิงที่เป็น lexical_cast.hpp แล้ว และสิ่งนี้ยังคงหลบหนีฉันไป

lexical_cast ซึ่ง 'คำจำกัดความพื้นฐาน' ใช้ทั้งแหล่งที่มาและปลายทางของเทมเพลตสามารถยอมรับไวยากรณ์เช่น lexical_cast<int>("7") ได้อย่างไร ฉันไม่เห็นว่าต้องใช้ประเภทการส่งคืนแบบเทมเพลตเท่านั้น และไม่ต้องการให้คุณระบุประเภทของพารามิเตอร์โดยไม่ทำสิ่งผิดกฎหมาย เช่น ความเชี่ยวชาญพิเศษด้านเทมเพลตบางส่วน

หมายเหตุ: ฉันเข้าใจว่าคุณสามารถทำได้ด้วยเทมเพลตประเภทเดียวและการโอเวอร์โหลดสำหรับพารามิเตอร์ที่แตกต่างกัน แต่ฉันไม่เข้าใจว่า lexical_cast นั้นอิงจากฟังก์ชันเทมเพลตที่ต้องใช้ทั้งเทมเพลตต้นทางและปลายทางอย่างไร


person 0x5f3759df    schedule 21.08.2011    source แหล่งที่มา


คำตอบ (4)


อาร์กิวเมนต์เทมเพลตสามารถอนุมานได้จากอาร์กิวเมนต์ของฟังก์ชัน:

template <typename T>
void foo(const T& x)
{
    // T is the type of X
}

foo(5); // T is be int
foo("hello"); //T is const char[6]
person GManNickG    schedule 21.08.2011

template <class Ret, class Input>
Ret lexical_cast(Input i)
{
   // ...
}

ประเภท Input อนุมานตามอาร์กิวเมนต์ที่ถูกส่งเข้ามา

person Arvid    schedule 21.08.2011

เนื่องจากคอมไพเลอร์สามารถอนุมานประเภทของอาร์กิวเมนต์จากอาร์กิวเมนต์ได้ แต่จะเป็นไปได้ก็ต่อเมื่อเป็นไปได้และไม่คลุมเครือเท่านั้น คอมไพเลอร์จะไม่อนุมานประเภทการส่งคืน นั่นเป็นเหตุผลว่าทำไมจึงจำเป็นต้องมีประเภทการส่งคืนแต่ไม่จำเป็นต้องใช้ประเภทอาร์กิวเมนต์

person Dani    schedule 21.08.2011

โดยพื้นฐานแล้ว มีแหล่งที่มาสามแหล่งสำหรับพารามิเตอร์เทมเพลตฟังก์ชัน:

  1. อาร์กิวเมนต์เทมเพลตที่ระบุอย่างชัดเจน
  2. ค่าเริ่มต้น
  3. อนุมานได้จากอาร์กิวเมนต์ของฟังก์ชัน

เทมเพลตฟังก์ชันสามารถสร้างอินสแตนซ์ได้หากสามารถแก้ไขพารามิเตอร์เทมเพลตทั้งหมดได้ ไม่จำเป็นว่าอาร์กิวเมนต์เทมเพลตแต่ละรายการจะได้รับการแก้ไขจากแหล่งเดียวกัน เช่น. ในกรณีของ boost::lexical_cast<OutType, InType> โดยทั่วไปแล้ว InType จะถูกอนุมานจากอาร์กิวเมนต์ของฟังก์ชัน และจะมีการระบุ OutType ไว้อย่างชัดเจน

person MSalters    schedule 22.08.2011