Rumah >pembangunan bahagian belakang >C++ >Bolehkah Fungsi Lebih Muatan dalam C Dicapai Berdasarkan Nilai Pulangan, dan jika ya, Bagaimana?
Pengenalan
Pembebanan lebihan fungsi dalam C biasanya melibatkan pembezaan fungsi berdasarkan jenis parameternya . Walau bagaimanapun, ia juga mungkin untuk membebankan fungsi berdasarkan nilai pulangannya. Ini membolehkan anda menentukan fungsi yang mengembalikan jenis data yang berbeza bergantung pada cara ia digunakan.
Pernyataan Masalah
Pertimbangkan tugas berikut:
int n = mul(6, 3); // n = 18 std::string s = mul(6, 3); // s = "666"
Di sini, anda perlu mentakrifkan fungsi bernama mul yang mengembalikan sama ada integer atau rentetan, bergantung pada cara nilai pulangannya digunakan.
Pendekatan Penyelesaian
Penaipan Eksplisit:
Satu pendekatan ialah membezakan panggilan secara eksplisit dengan menaip. Sebagai contoh, anda boleh menentukan dua fungsi berasingan:
int mul(int, int); std::string mul(char, int);
Dan panggilnya seperti berikut:
int n = mul(6, 3); // n = 18 std::string s = mul('6', 3); // s = "666"
Penunjuk Dummy:
Satu lagi kaedah melibatkan penambahan parameter dummy pada setiap fungsi, memaksa pengkompil untuk memilih yang betul. Contohnya:
int mul(int *, int, int); std::string mul(std::string *, char, int);
Dan gunakannya dengan:
int n = mul((int *) NULL, 6, 3); // n = 18 std::string s = mul((std::string *) NULL, 54, 3); // s = "666"
Templat Nilai Pulangan (Pilihan 1):
Anda boleh mencipta fungsi "dummy" dengan kod yang tidak akan dikompilkan jika digunakan segera. Kemudian, tentukan versi templat khusus untuk jenis pulangan yang diingini:
template<typename T> T mul(int, int); template<> int mul<int>(int, int); template<> std::string mul<std::string>(int, int);
Gunakannya seperti berikut:
int n = mul<int>(6, 3); // n = 18 std::string s = mul<std::string>(54, 3); // s = "666"
Templat Nilai Pulangan (Pilihan 2):
Untuk kes dengan parameter yang berbeza, anda boleh menentukan pengkhususan templat yang berasingan dengan parameter yang berbeza jenis:
template<typename T> T mul(int, int); template<> int mul<int>(int, int); template<typename T> T mul(char, int); template<> std::string mul<std::string>(char, int);
Dan panggil mereka sebagai:
int n = mul<int>(6, 3); // n = 18 std::string s = mul<std::string>('6', 3); // s = "666"
Atas ialah kandungan terperinci Bolehkah Fungsi Lebih Muatan dalam C Dicapai Berdasarkan Nilai Pulangan, dan jika ya, Bagaimana?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!