[英]Function overloading with different return types
我知道我們不允許僅基於返回類型重載函數。 假設我有兩個函數double convert(string num)
和int convert(string num)
請考慮以下示例代碼:
double convert(string num){
stringstream ss;
double d_num;
ss<<num;
ss>>d_num;
return d_num;
}
int convert(string num){
int i_num;
/*.....
same as previous
.....
*/
return i_num;
}
在main()中:
int main(){
string st="09122321";
double d1=convert(st);
int i1=convert(st);
}
雖然我重載函數只是在返回類型上有所不同但是因為我根據它們的返回類型將它們分配給數據類型不是我應該在double d1
和int i1
獲得轉換后的string num
?
現在我得到的錯誤類似於:
錯誤:新聲明'int convert(std :: string)'| 錯誤:模糊舊聲明'double convert(std :: string)'|
如果我希望它通過重載函數讓它具有不同的返回類型,我convert()
如何使convert()
工作?
如果我希望它通過重載函數讓它具有不同的返回類型,我將如何使convert()工作?
您可以創建一個簡單的功能模板。
template <typename T>
T convert(std::string const& num){
std::istringstream ss(num);
T d_num;
ss>>d_num;
return d_num;
}
並將其專門用於std::string
以便輸入參數用於復制構造返回的std::string
。
template <>
std::string convert<std::string>(std::string const& in){
return in;
}
並將其用作:
auto d1 = convert<double>(st);
auto i1 = convert<int>(st);
一種方法是將所需的返回類型作為輸出變量傳遞。 有了這個,您的代碼將成為:
void convert(string num, double *d_num){
stringstream ss;
ss<<num;
ss>>*d_num;
}
void convert(string num, int *i_num){
/*.....
same as previous
.....
*/
}
由於函數的參數簽名不同,因此過載很好。
您不能基於C和C ++中的返回類型重載,但您可以通過返回類並提供轉換運算符來作弊。 (不要忘記插入操作符。)看哪:
#include <iostream>
#include <string>
struct fib
{
unsigned long value;
fib( unsigned n )
{
value = !!n;
if (!n) return;
unsigned long prev = 0;
while (--n)
{
long next = value + prev;
prev = value;
value = next;
}
}
operator long () const { return value; }
operator std::string () const { return std::to_string( value ); }
};
std::ostream& operator << ( std::ostream& outs, const fib& f )
{
return outs << (std::string)f;
}
void print( double x )
{
std::cout << "fib 3 = " << x << "\n";
}
int main()
{
long x = fib( 5 );
std::string s = fib( 7 );
print( fib( 3 ) );
std::cout << "fib 5 = " << x << "\n";
std::cout << "fib 7 = " << s << "\n";
std::cout << "fib 9 = " << fib( 9 ) << "\n";
}
請享用!
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.