У меня есть структура «foo» со многими членами, одна из которых (двойная панель) доступна несколько раз в основных операциях. Таким образом, вместо написания, например:Объединение или замена нескольких аналогичных перегрузок
double a=foo.bar+3;
double b=foo.bar*5;
bool c=foo.bar==2;
Я хотел написать:
double a=foo+3;
double b=foo*5;
bool c=foo==2;
Один подход будет перегружать все требуемые операторы в свободных функций:
template< class T>
double [email protected](foo a,T b){
return [email protected];
}
template< class T>
double [email protected](T b,foo a){
return [email protected];
}
Я бы тогда скопировать и вставить этот фрагмент и заменить @ на +, *, == и другие операции, которые я хотел.
Есть ли лучший (более читаемый, менее повторяющийся, более короткий и/или безопасный) способ сделать это? Например, используя шаблоны или направляя компилятор, чтобы попытаться подставить «foo» на «foo.bar» всякий раз, когда он не находит соответствия для функции с участием «foo».
Помимо: '^' не оператор возведения в степень в C++. (и по причинам приоритета, это плохая идея обеспечить перегрузку, которая действует как возведение в степень) – Hurkyl
Я пропустил что-то очевидное здесь? 'double tmp = foo.bar; double a = tmp + 3; double b = tmp * 3; ... ' –
@ Konrad Это действительно возможно, но у меня много таких структур в довольно длинных уравнениях, а затем придется управлять несколькими временными переменными. Кроме того, в контексте сохранение их имен улучшает читаемость (скажем, используя F для силы, m для массы и a для ускорения, чтобы получить F = m * a) – guivenca