具有不同返回类型的函数重载
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()具有不同的返回类型,我将如何使其工作?
您可以创建一个简单的函数模板。
template <typename T>
T convert(std::string const& num){
std::istringstream ss(num);
T d_num;
ss>>d_num;
return d_num;
}
并将其专门化为CCD_ 7,以便输入参数用于复制构造返回的CCD_。
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";
}
享受吧!
相关文章:
- 为什么使用SFINAE而不是函数重载
- 为什么我不能在 C++ 中的特定函数重载中调用同一函数的任何其他重载?
- c++:可变模板和函数重载
- 在缺少函数重载时抛出异常,并带有 std::variant 而不是编译时错误
- 解决模板成员函数重载
- 为什么不允许成员函数和非成员函数之间的函数重载?
- 推断模板化函数中的函数重载
- C++复制函数重载导致"must be a nonstatic member function"错误
- 为什么 std::sort 找不到合适的(静态成员)函数重载?
- 可变参数泛型 lambda 和函数重载
- C++中的函数重载和继承
- 当有右值构造函数可用时,为什么从右值调用类引用构造函数重载?
- C/C++ 可变参数宏函数重载
- 将基类的成员函数重载到其他派生类C++
- C++ 函数重载匹配
- C++函数重载,具体步骤是什么
- C++:使用 param pack 显式调用函数重载
- 隐式生成的函数重载用于右值参数?
- 使用函数重载输入运算符
- 运算符重载函数上的函数重载