#include <iostream>
using namespace std;
template <class X, class Y>
Y big(X a, Y b)
{
if (a > b)
return (a);
else return (b);
}
int main()
{
cout << big(32.8, 9);
}
Di sini saya menggunakan template di CPP, jadi ketika saya memanggil fungsi big
mem-bypass argumen double
dan int
mengetik, saya ingin jawaban balik yang double
. Ketik di sini, ia mengembalikan 32
bukan 32.8
.
Bagaimana saya mendapatkan hasil yang saya inginkan? Bagaimana cara menulis jenis big
fungsi pengembalian yang tepat ?
c++
function
templates
return-type
function-templates
Rakshanda Meshram
sumber
sumber
std::max
penerapannya. Tipe pengembalian fungsi harus diketahui pada waktu kompilasi dalam C ++. Jadi Anda tidak dapat memiliki tipe pengembalian ini bergantung pada nilai runtime dari parameter Anda. Inilah sebabnya mengapa untuk fungsi tersebut, Anda memerlukan kedua parameter untuk memiliki tipe yang sama (yaitu, memiliki tipe X, tetapi tidak Y).Jawaban:
Suatu fungsi hanya dapat memiliki satu tipe pengembalian yang harus diketahui pada waktu kompilasi. Namun, Anda dapat menggunakan
std::common_type
, untuk mengembalikan tipe yang kedua parameter dapat secara implisit dikonversi.Itu akan menjadi
Dan untuk memeriksa apakah itu benar-benar mengembalikan
double
ketika dilewatiint
dandouble
kita dapat melakukan:Yang dicetak
PS:
std::common_type
dapat menggunakan operator ternary di belakang layar dan dengan demikian solusi ini tidak jauh berbeda dari jawaban lain (auto
+ ternary). Kekuatan sebenarnyastd::common_type
adalah ia menerima sejumlah parameter.sumber
Jenis pengembalian harus ditentukan pada waktu kompilasi. Anda dapat menggunakan trailing return dengan operator bersyarat , jika Anda terbatas pada c ++ 11 .
Lihat langsung
Namun, jika Anda memiliki akses ke c ++ 14 atau
auto
return yang lebih tinggi sudah cukup, karena kompiler akan menyimpulkan tipe yang tepat jika Anda menggunakannya bersama dengan operator kondisional sebagai berikut:Lihat langsung
sumber
const
).Dalam menandai jenis pengembalian Anda sebagai
Y
dan meneruskanint
sebagai parameter kedua Anda, Anda telah dengan jelas menunjukkan bahwa ituY
adalahint
. Tidak ada kejutan di sini.Ini mencetak keempat nilai yang benar ke layar.
https://godbolt.org/z/fyGsmo
Satu hal yang penting untuk dicatat adalah bahwa ini hanya akan berfungsi untuk jenis yang dapat dibandingkan satu sama lain, yaitu, kompiler secara implisit akan mengkonversi satu jenis ke yang lain untuk perbandingan.
PENTING : Parameter perlu diambil dengan referensi untuk menghindari perilaku yang tidak terdefinisi. Ini ada hubungannya dengan tipe kembalinya aku dengan keras kepala menempel.
decltype(auto)
dapat mengembalikan referensi ke tipe. Jika Anda mengembalikan sesuatu yang lokal ke fungsi (jumlah argumen), Anda mendapatkan perilaku yang tidak terdefinisi.sumber
Ini bukan solusi yang tepat untuk situasi Anda yang tepat, dalam semua kemungkinan - jawaban lain cenderung lebih dekat dengan apa yang Anda inginkan.
Namun, jika Anda benar - benar perlu mengembalikan tipe yang sama sekali berbeda pada saat runtime karena suatu alasan, solusi yang benar (karena c ++ 17 ) adalah dengan menggunakan a
std::variant
, yang merupakan jenis penyatuan tipe-aman.Perhatikan bahwa kemudian tanggung jawab ada pada penelepon untuk menangani nilai yang dikembalikan, kemungkinan besar menggunakan
std::visit
atau sejenisnya.sumber
Ia mengembalikan int karena Y adalah sebuah int dan ia melemparkan 32,8 ke dalamnya. Ketika Anda memanggil big 32,82 adalah float, tetapi 8 adalah int dan tipe pengembalian fungsi adalah Y, yang juga int.
Anda tidak dapat benar-benar memperbaiki ini karena Anda perlu tahu pada saat runtime jenis pengembalian besar, jadi buatlah dan b jenis yang sama seperti ini:
sumber