2015-09-23 2 views
0

У меня есть структура «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».

+0

Помимо: '^' не оператор возведения в степень в C++. (и по причинам приоритета, это плохая идея обеспечить перегрузку, которая действует как возведение в степень) – Hurkyl

+2

Я пропустил что-то очевидное здесь? 'double tmp = foo.bar; double a = tmp + 3; double b = tmp * 3; ... ' –

+0

@ Konrad Это действительно возможно, но у меня много таких структур в довольно длинных уравнениях, а затем придется управлять несколькими временными переменными. Кроме того, в контексте сохранение их имен улучшает читаемость (скажем, используя F для силы, m для массы и a для ускорения, чтобы получить F = m * a) – guivenca

ответ

1

Поскольку вы просто хотите получить обратно double (а не то, что foo есть) можно просто определить оператор преобразования в double:

struct foo { 
    double bar; 
    operator double() const { return this->bar; } 
}; 
Смежные вопросы