Bagaimana boost::lexical_cast hanya mengambil satu jenis templat?

Saya telah memeriksa kekacauan yang ada di lexical_cast.hpp dan ini terus luput dari perhatian saya.

Bagaimana lexical_cast, yang 'definisi dasarnya' mengambil sumber dan tujuan templat, dapat menerima tata bahasa seperti lexical_cast<int>("7")? Saya tidak mengerti bagaimana ini hanya memerlukan tipe pengembalian templat dan Anda tidak perlu memberikan tipe parameter tanpa melakukan sesuatu yang ilegal seperti spesialisasi templat parsial.

Catatan: Saya memahami bagaimana Anda dapat melakukan ini dengan satu tipe templat dan kelebihan beban untuk parameter yang berbeda, tetapi saya gagal memahami bagaimana lexical_cast didasarkan pada fungsi templat yang memerlukan tipe templat sumber dan tujuan.


person 0x5f3759df    schedule 21.08.2011    source sumber


Jawaban (4)


Argumen templat dapat disimpulkan dari argumen fungsi:

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)
{
   // ...
}

Tipe Input disimpulkan berdasarkan argumen yang disampaikan.

person Arvid    schedule 21.08.2011

Itu karena kompiler dapat menyimpulkan jenis argumen dari argumen tersebut, namun hanya jika memungkinkan dan tidak ambigu. Kompiler tidak akan menyimpulkan tipe pengembalian. Itu sebabnya tipe pengembalian diperlukan tetapi tipe argumen tidak.

person Dani    schedule 21.08.2011

Pada dasarnya, ada tiga sumber untuk parameter templat fungsi:

  1. Argumen templat yang diberikan secara eksplisit.
  2. Nilai dasar
  3. Disimpulkan dari argumen fungsi

Templat fungsi dapat dibuat instance-nya jika semua parameter templat dapat diselesaikan. Setiap argumen templat tidak harus diselesaikan dari sumber yang sama. Misalnya. dalam kasus boost::lexical_cast<OutType, InType>, InType biasanya disimpulkan dari argumen fungsi dan OutType disediakan secara eksplisit.

person MSalters    schedule 22.08.2011