2

重複の可能性:
リターンタイプによるオーバーロード

関数の出力のみをオーバーロードすることは可能ですか?たとえば、2つの異なる方法でポーズを返すことができる関数があるとします。6DOFポーズまたは同種の変換行列。だから私は2つの機能を持っているでしょう:

Eigen::Vector6f pose();

Eigen::Matrix4d pose();

出力だけをオーバーロードしても大丈夫ですか?

そうすると、コンパイラはどの関数を使用するかをどのように知るのでしょうか?

私がこれをするときそれはそれを言うことができます:

Eigen::Matrix4d poseHolder = pose();

2番目の関数を使用するには?そうでない場合は、個別に名前を付けた関数を使用せずにこれを実現する方法はありますか?

4

3 に答える 3

5

いいえ、通常はこれを行うことはできません。2つの異なる関数に同じ名前を使用することを本当に主張する場合は、オーバーロードされた変換演算子を使用してプロキシオブジェクトを返すことで、偽の名前を付けることができます。

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

関数のオーバーロードの鍵は、関数シグネチャとも呼ばれる関数の引数リストです。

2 つの関数が同じ数と型の引数を同じ順序で使用する場合、それらは同じシグネチャを持ちます。変数名は関係ありません。C++ では、関数のシグネチャが異なる場合、同じ名前で 2 つの関数を定義できます。

署名は、引数の数または引数の型、またはその両方が異なる場合があります。

戻り値を保存したくない場合はpose();、どのサンプルを呼び出す必要がありますか?

pose();
于 2012-12-16T23:56:28.163 に答える