函数 return 类型重载 C++
Function return type overloading C++
我读到你只能通过参数类型而不是 return 类型来重载函数。
最近我尝试学习如何使用 <filesystem>
。
Here 我发现 current_path();
函数有一个 return 类型的 path
,但是如果你这样调用它 current_path(path('path/to/a/directory'));
它会改变你的CWD 和 returns void
问题
- 是否可以这样做,还是只是提供虚假信息的网站?
- 如果可以,我自己怎么办?
- 我是 C++ 的新手,所以请以初学者可以理解的方式进行解释。
is it possible to do that
是的,这是可能的。不同的重载可以有不同的 return 类型。
Return不同重载之间类型也可以相同,但不同重载之间参数列表不能相同
or is it just the website that gives false information?
链接的文档是正确的。
if it is possible, how can i do it myself?
与所讨论的标准重载函数相同的方式。这是一个最小的例子:
int foo(); // 1
void foo(int); // 2
int i = foo(); // calls 1
foo(i); // calls 2
void foo(); // NOT OK
// same parameter list as 1
// but different return type
您不能仅基于 return 类型进行重载。简而言之,编译器根据参数确定要调用的重载。因此,您无法区分基于 only 和 return 类型的两个重载:
int f() { return 42; }
double f() { return 3.14; } // error redeclaration of f()
f(); // calls what function ?!?
当参数类型不同时,两个重载可以有不同的 return 类型:
int g() { return 42; } // (1)
double g(int) { return 3.14; } // (2)
g(); // calls (1)
g(1); // calls (2)
虽然香草重载不会让您仅基于 return 类型进行重载,但有一个巧妙的技巧可以模拟它。忍耐一下。
上述 f
重载会导致编译器错误,因为它们不是有效的重载集(仅 return 类型不同)。但是我们可以定义两个单独的函数:
int f_int(){ return 42; }
double f_double() { return 3.14; }
我们可以定义一个类型,其目的只是可以转换为 int
或 double
。在该转换期间,我们可以调用相应的 f_x
:
struct foo {
operator int() { return f_int(); }
operator double() { return f_double(); }
};
现在这两行:
int x = foo{};
double y = foo{};
根据我们分配的内容分别调用 f_int
或 f_double
。
但是,请对此持保留态度。实际上很少需要仅基于 return 类型进行重载。如果从上下文中不清楚正在发生的事情,那两条线可能会相当模糊。隐式转换总是混淆的根源。最后但最不重要的一点是,它也不太适合“几乎总是自动”。
我读到你只能通过参数类型而不是 return 类型来重载函数。
最近我尝试学习如何使用 <filesystem>
。
Here 我发现 current_path();
函数有一个 return 类型的 path
,但是如果你这样调用它 current_path(path('path/to/a/directory'));
它会改变你的CWD 和 returns void
问题
- 是否可以这样做,还是只是提供虚假信息的网站?
- 如果可以,我自己怎么办?
- 我是 C++ 的新手,所以请以初学者可以理解的方式进行解释。
is it possible to do that
是的,这是可能的。不同的重载可以有不同的 return 类型。
Return不同重载之间类型也可以相同,但不同重载之间参数列表不能相同
or is it just the website that gives false information?
链接的文档是正确的。
if it is possible, how can i do it myself?
与所讨论的标准重载函数相同的方式。这是一个最小的例子:
int foo(); // 1
void foo(int); // 2
int i = foo(); // calls 1
foo(i); // calls 2
void foo(); // NOT OK
// same parameter list as 1
// but different return type
您不能仅基于 return 类型进行重载。简而言之,编译器根据参数确定要调用的重载。因此,您无法区分基于 only 和 return 类型的两个重载:
int f() { return 42; }
double f() { return 3.14; } // error redeclaration of f()
f(); // calls what function ?!?
当参数类型不同时,两个重载可以有不同的 return 类型:
int g() { return 42; } // (1)
double g(int) { return 3.14; } // (2)
g(); // calls (1)
g(1); // calls (2)
虽然香草重载不会让您仅基于 return 类型进行重载,但有一个巧妙的技巧可以模拟它。忍耐一下。
上述 f
重载会导致编译器错误,因为它们不是有效的重载集(仅 return 类型不同)。但是我们可以定义两个单独的函数:
int f_int(){ return 42; }
double f_double() { return 3.14; }
我们可以定义一个类型,其目的只是可以转换为 int
或 double
。在该转换期间,我们可以调用相应的 f_x
:
struct foo {
operator int() { return f_int(); }
operator double() { return f_double(); }
};
现在这两行:
int x = foo{};
double y = foo{};
根据我们分配的内容分别调用 f_int
或 f_double
。
但是,请对此持保留态度。实际上很少需要仅基于 return 类型进行重载。如果从上下文中不清楚正在发生的事情,那两条线可能会相当模糊。隐式转换总是混淆的根源。最后但最不重要的一点是,它也不太适合“几乎总是自动”。