Rumah >pembangunan bahagian belakang >C++ >Bolehkah Fungsi C Dibebankan Berdasarkan Nilai Pulangannya?

Bolehkah Fungsi C Dibebankan Berdasarkan Nilai Pulangannya?

DDD
DDDasal
2024-12-01 01:49:09955semak imbas

Can C   Functions Be Overloaded Based on Their Return Value?

Fungsi Lebih Muatan Berdasarkan Nilai Pulangan dalam C

Fungsi lebih muatan berdasarkan parameter adalah amalan biasa dalam C . Walau bagaimanapun, lebihan beban berdasarkan nilai pulangan juga mungkin, membolehkan anda mencipta fungsi yang berkelakuan berbeza bergantung pada cara nilai pulangan digunakan.

Terdapat beberapa kaedah untuk mencapai ini:

Penaipan Panggilan Eksplisit

Gunakan jenis yang berbeza untuk literal yang dihantar ke fungsi. Contohnya, untuk fungsi mengembalikan integer atau rentetan bergantung pada penggunaan:

int mul(int, int);
std::string mul(char, int);

int n = mul(6, 3); // Function called with int return value
std::string s = mul('6', 3); // Function called with string return value

Pendekatan Penunjuk Dummy

Tambah parameter penunjuk tiruan pada setiap fungsi, memaksa pengkompil untuk memilih versi yang betul berdasarkan nilai pulangan jenis:

int mul(int*, int, int);
std::string mul(std::string*, char, int);

int n = mul((int*)NULL, 6, 3); // Function called with int return value
std::string s = mul((std::string*)NULL, '6', 3); // Function called with string return value

Pengkhususan Templat untuk Nilai Pulangan

Buat fungsi templat dan mengkhususkannya untuk jenis pulangan tertentu:

template<typename T>
T mul(int, int)
{
    // Generic function with a dummy member variable that will cause a compilation error
    // if not specialized
    const int k = 25;
    k = 36;
}

template<>
int mul<int>(int, int)
{
    return i * j;
}

template<>
std::string mul<std::string>(int, int)
{
    return std::string(j, static_cast<char>(i));
}

int n = mul<int>(6, 3); // Function called with int return value
std::string s = mul<std::string>('6', 3); // Function called with string return value

Kaedah ini memerlukan secara eksplisit menyatakan jenis pemulangan apabila memanggil fungsi untuk dielakkan kekaburan.

Pengkhususan Templat dengan Berbilang Parameter

Untuk terlebih muatan berdasarkan parameter berbeza untuk jenis nilai pulangan yang sama, cipta templat berasingan untuk setiap kombinasi parameter:

template<typename T>
T mul(int, int)
{
    // Generic function with a dummy member variable that will cause a compilation error
    // if not specialized
    const int k = 25;
    k = 36;
}

template<>
int mul<int>(int, int)
{
    return i * j;
}

template<typename T>
T mul(char, int)
{
    // Generic function with a dummy member variable that will cause a compilation error
    // if not specialized
    const int k = 25;
    k = 36;
}

template<>
std::string mul<std::string>(char, int)
{
    return std::string(j, static_cast<char>(i));
}

int n = mul<int>(6, 3); // n = 18
std::string s = mul<std::string>('6', 3); // s = "666"

Menggunakan teknik ini, anda boleh membebankan fungsi secara berkesan berdasarkan nilai pulangannya, membolehkan lebih serba boleh dan kod fleksibel.

Atas ialah kandungan terperinci Bolehkah Fungsi C Dibebankan Berdasarkan Nilai Pulangannya?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!

Kenyataan:
Kandungan artikel ini disumbangkan secara sukarela oleh netizen, dan hak cipta adalah milik pengarang asal. Laman web ini tidak memikul tanggungjawab undang-undang yang sepadan. Jika anda menemui sebarang kandungan yang disyaki plagiarisme atau pelanggaran, sila hubungi admin@php.cn