2

可能重复:
按返回类型重载

是否可以仅重载函数的输出。例如,我有一个可以以两种不同方式返回姿势的函数。一个 6DOF 位姿或同质变换矩阵。所以我有两个功能:

Eigen::Vector6f pose();

Eigen::Matrix4d pose();

可以超载唯一的输出吗?

如果我这样做,那么编译器将如何知道要使用哪个函数?

它可以告诉我什么时候这样做:

Eigen::Matrix4d poseHolder = pose();

要使用第二个功能?如果没有,有没有办法在不单独命名函数的情况下实现这一点?

4

3 回答 3

5

不,你通常不能这样做。如果你真的坚持对两个不同的函数使用相同的名称,你可以通过返回一个带有重载转换运算符的代理对象来伪装它:

struct Proxy {
    operator Eigen::Vector6f() const {
        // ...
    }

    operator Eigen::Matrix4d() const {
        // ...
    }
};

Proxy pose() { return Proxy(); }
于 2012-12-16T23:51:03.223 回答
1

重载函数的签名必须不同。对于普通函数,返回类型不是签名的一部分,所以你不能做你想要的。对于函数模板,尽管返回类型是签名的一部分,因此您可以重载仅因返回类型不同而不同的函数模板。

规则是合乎逻辑的。实际上,对于普通函数,编译器(在一般情况下)不知道要调用哪个函数。在函数模板的情况下,调用者可以自由地明确指定返回类型。

于 2012-12-16T23:49:13.653 回答
1

函数重载的关键是函数的参数列表,也称为函数签名

如果两个函数以相同的顺序使用相同数量和类型的参数,则它们具有相同的签名;变量名无关紧要。C++ 允许您使用相同的名称定义两个函数,前提是这些函数具有不同的签名。

签名可以在参数数量或参数类型上有所不同,或两者兼而有之。

以您的样本为例,如果您不想存储返回值,pose();那么应该调用哪一个?

pose();
于 2012-12-16T23:56:28.163 回答