Ответ Jarod42 дает вам синтаксис, который вы хотите, но я субъективно думаю, что он не идеален.Изначально вы хотели передать смещение, но теперь вы передаете массив и превращаете его в смещение.Это странное отношение типов.
Вместо структуры и отдельных функций просто поместите все это в класс Offset.На самом деле это не какая-то дополнительная работа, и она делает C ++ лучше.То, что у вас есть, больше похоже на объектно-ориентированный C.
#include <iostream>
// Create a self-contained class
template <typename Component = double>
class Offset {
public:
Offset(Component x, Component y) : x(x), y(y) {}
// No longer requires function parameters
Offset const perpendicular() const { return Offset(y, -x); }
// I appreciate your use of east const
friend std::ostream& operator<<(std::ostream& sout,
Offset<Component> const& o) {
return sout << '(' << o.x << ", " << o.y << ')';
}
private:
Component x;
Component y;
};
int main() {
// Subjectively much cleaner to read and understand
std::cout << Offset{3.1, 1.2}.perpendicular() << '\n';
return 0;
}
Для дальнейшего использования можно использовать decltype(auto)
в качестве возвращаемого типа и полностью отказаться от синтаксиса завершающего возвращаемого типа начиная с C ++ 14.