2015-11-03 5 views
0

Для назначения мне нужно закодировать класс матрицы, следуя некоторым четким инструкциям. Одна из инструкций перегрузки оператора < <, так что мы можем прочитать значения это точный способ для матрицы м:C++ 11 specefic перегрузка << operator

m << 1,2,3,4,5,6; 

я пытался смотреть в функции с переменными параметрами, а затем я увидел, что я могу» t перегружает оператор переменным числом параметров.

я пытался смотреть в станд :: initializer_list, используя некоторый код ссылки из cpp reference

std::vector<float> mat; 


Mat<M,N>& operator<<(std::initializer_list<float> l) 
{ 
    this->mat.insert(this->mat.begin(),l.begin(),l.end()); 

    return *this; 
} 

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

большое спасибо.

EDIT: После большого ответа от @ bames53 я попытался включить, и он работает просто отлично!

+1

Это одно сложное задание для школьного класса. В любом случае, посмотрите «оператор перегрузки прокси типа запятой» и получайте удовольствие :) –

+0

спасибо, что я попытался изучить это, я не нашел много информации о перегрузке запятой: s, к сожалению –

+1

Вы искали только пять минут, но Google дает " около 218 000 результатов "для поискового запроса, который я вам предоставил. Потратьте немного больше исследований. –

ответ

3

<< имеет более высокий приоритет, чем , так, что ваше выражение m << 1,2,3,4,5,6 делает:

((((((m << 1), 2), 3), 4), 5), 6) 

Другими словами, вам нужно m << 1 вернуть объект, представляющий операцию, прочитав в 1 и который готов читать 2. Такие вещи часто выполняются с помощью так называемых «шаблонов выражений», хотя в вашем случае вам действительно не нужны шаблоны.

Ваше использование будет иметь разницу в том, что вам нужно изменить объект по мере продвижения, в то время как обычные шаблоны выражений работают лениво, ожидая, пока их объект не будет преобразован в конечный тип результата до фактического выполнения работы.

#include <iostream> 

// a type to do something with 
struct M { int i; }; 

// a type to represent the operations 
struct Input_operation { M &m; int count; }; 


Input_operation operator << (M &m, int i) { 
    m.i = i; 
    return {m, 1}; 
} 

Input_operation operator , (Input_operation op, int i) { 
    op.m.i += i; 
    op.count++; 
    return op; 
} 

int main() { 
    M m; 
    m << 1, 2, 3, 4, 5, 6; 
    std::cout << m.i << '\n'; 
} 
+0

Благодарим вас за ответ, я стараюсь понять ваш код (я не скажу, что я это делаю сейчас), и проведу несколько тестов, чтобы увидеть, как это работает :)! спасибо –

+0

Я попытался использовать это в своем собственном коде, где у меня есть матричный класс матрицы и вектор, хранящий элементы, я отредактирую свой вопрос, чтобы получить более чистый код, чтобы показать вам –

+0

большое спасибо, я его получил! и теперь он отлично работает в моем коде! мне было интересно, можно ли сделать версию с операторами, внутренними для моего класса –

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