Возможный дубликат:
Перегрузка по типу возврата
Можно ли перегрузить только вывод функции. Скажем, например, у меня есть функция, которая может вернуть позу двумя различными способами. Поза 6DOF или матрица однородного преобразования. Так что у меня будет две функции:
Eigen::Vector6f pose();
а также
Eigen::Matrix4d pose();
Можно ли перегрузить только выход?
Если я это сделаю, то как компилятор узнает, какую функцию использовать?
Может ли он сказать, когда я делаю это:
Eigen::Matrix4d poseHolder = pose();
Использовать вторую функцию? Если нет, то есть ли способ сделать это, не имея отдельно названных функций?
Нет, ты не можешь нормально делать это. Если вы действительно настаиваете на использовании одного и того же имени для двух разных функций, вы можете имитировать его, возвращая прокси-объект с перегруженными операторами преобразования:
struct Proxy {
operator Eigen::Vector6f() const {
// ...
}
operator Eigen::Matrix4d() const {
// ...
}
};
Proxy pose() { return Proxy(); }
Перегруженные функции должен отличаются по своей подписи. Для простых функций возвращаемый тип не является частью подписи, поэтому вы не можете делать то, что вам нужно. Для шаблонов функций, хотя возвращаемый тип является частью сигнатуры, вы можете перегружать шаблоны функций, которые отличаются только типом возвращаемого значения.
Правила логичны. Действительно, для нормальных функций компилятор (в общем случае) не будет знать, какую функцию вызывать. В случае шаблонов функций вызывающая сторона может явно указать тип возвращаемого значения.
Ключом к перегрузке функции является список аргументов функции, также называемый подпись функции.
Если две функции используют одинаковое количество и типы аргументов в одинаковом порядке,
они имеют одинаковую подпись; имена переменных не имеют значения. C ++ позволяет вам определить
две функции с одинаковым именем, при условии, что функции имеют разные подписи.
Сигнатура может отличаться по количеству аргументов или по типу аргументов, или по обоим.
Возьмите ваш образец, если вы просто не хотите хранить возвращаемое значение pose();
тогда какой должен быть назван?
pose();