函数 return 类型重载 C++

Function return type overloading C++

我读到你只能通过参数类型而不是 return 类型来重载函数。

最近我尝试学习如何使用 <filesystem>

Here 我发现 current_path(); 函数有一个 return 类型的 path,但是如果你这样调用它 current_path(path('path/to/a/directory')); 它会改变你的CWD 和 returns void

问题

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; }

我们可以定义一个类型,其目的只是可以转换为 intdouble。在该转换期间,我们可以调用相应的 f_x:

struct foo {
    operator int() { return f_int(); }
    operator double() { return f_double(); }
};

现在这两行:

int x = foo{};
double y = foo{};

根据我们分配的内容分别调用 f_intf_double

live demo

但是,请对此持保留态度。实际上很少需要仅基于 return 类型进行重载。如果从上下文中不清楚正在发生的事情,那两条线可能会相当模糊。隐式转换总是混淆的根源。最后但最不重要的一点是,它也不太适合“几乎总是自动”。