2014-12-13 4 views
2

Я просто хочу знать, если мы можем дать два или более параметров к перегрузке оператора < <C++ перегрузка << оператор несколько параметров

An Exemple будет более явным:

anyType   operator<<(arg p1, arg p2) 
{ 
DoSomethingWith(p1); 
DoSomethingWith(p2); 
return (*this); 
} 

и использование это нравится:

anyVar << anyVar2, anyVar3; 

Благодарности

+0

Примечания: Ваш пример использует два оператор (оператор << и оператор, (запятая)) –

ответ

4

Нет, это невозможно.

Ближайшие вы можете прийти будет что-то вроде:

anyType   operator<<(std::pair<arg, arg> p) 
{ 
    DoSomethingWith(p.first); 
    DoSomethingWith(p.second); 
    return (*this); 
} 

anyvar << std::make_pair(a1, a2); 

В качестве альтернативы, вы можете сделать что-то гораздо более сложное, чтобы эффективно Карри вызова к вашему оператору, имея anyType::operator<<(arg) возвращение временного объекта, который просто держит на к его аргументу и реализует другой tempObject::operator<<(arg), который фактически выполняет эту работу. Затем вы можете назвать это как anyvar << arg1 << arg2. Я действительно сомневаюсь, что это стоит того, кроме опыта обучения.

Нечто похожее на этот стиль часто используется в шаблоне «строитель», но использует функции-члены, а не явный оператор. Это полезно, потому что вы можете организовать эффективную настройку параметров конфигурации независимо от порядка.

+0

Спасибо! Я думаю, что я буду делать с std :: pair, это немного сложно, но выглядит хорошо для меня – taof

+1

Думаю, в этот момент было бы разумно спросить * почему * вы считаете, что оператор '<<' - правильный выбор функции перегрузка для этого поведения. нестандартная перегрузка оператора очень сложно поддерживать и отлаживать. –

0

Нет, вы не можете этого сделать. Бинарный оператор может быть перегружен только для того, чтобы взять два операнда, либо как функцию-член с одним параметром, либо (за исключением операторов присваивания), не являющийся членом с двумя.

Если вы хотите что-то большее, чем функция, напишите функцию.

В качестве альтернативы, вы можете написать свой оператор, чтобы позволить сцепление, так же, как стандартные перегрузки для потоков ввода/вывода сделать:

anyType & operator<<(arg p) { // return a reference, not a copy 
    DoSomethingWith(p); 
    return *this; 
} 

anyvar << anyVar2 << anyVar3; // Does the thing to each variable, in turn. 
+0

Хорошо, спасибо! Но я не очень хорошо объясняю, я хочу делать разные вещи с p1 и p2, поэтому я не могу так. Я буду делать, как говорит Ричи, с помощью std :: pair или, как вы говорите, просто с функцией – taof

Смежные вопросы