0 / 0 / 0
Регистрация: 01.03.2012
Сообщений: 24
|
|
1 | |
Можно ли сравнивать потоки?02.03.2012, 05:39. Показов 5194. Ответов 41
Метки нет (Все метки)
А точнее, проверять их на равенство? Скажем, допустимо ли в перегруженном операторе ввода использовать конструкцию if (stream == cout), и будет ли она корректно работать?
0
|
02.03.2012, 05:39 | |
Ответы с готовыми решениями:
41
Можно ли сравнивать строковые литералы? как правильно это сделать? Как можно сравнивать в структуре числа и выводить на экран по возрастанию, если структура находится в файле? О потоках std::thread: можно ли вложить потоки друг в друга и можно ли создать динамический массив потоков? Switch. Можно ли сравнивать строки? |
40 / 40 / 7
Регистрация: 21.02.2012
Сообщений: 95
|
|
02.03.2012, 13:20 | 21 |
Nameless One, что? если один поток фэйл они точно будут не равны даже если одного типа.
если оба потока гуд - то вернется this дочернего класса который подставится в сравнение
0
|
5828 / 3479 / 358
Регистрация: 08.02.2010
Сообщений: 7,448
|
|
02.03.2012, 13:25 | 22 |
Luke, где гарантии, что у других компиляторов (или на другой платформе) или у новой версии MinGW будет точно такое же поведение?
я тебе говорю, что «равенство» stream1 == stream2 не означает равенство потоков, оно означает, что stream1.fail() == stream2.fail()? Что тут непонятного?
0
|
5828 / 3479 / 358
Регистрация: 08.02.2010
Сообщений: 7,448
|
||||||
02.03.2012, 13:28 | 23 | |||||
Вот тебе пример:
Ну и еще раз цитата из стандарта: обрати внимание на фразу "one possible". Эта значит, что конкретная реализация может возвращать (void*) this, другая — (void*) 100500, третья — еще что-то и т.д.
0
|
0 / 0 / 0
Регистрация: 01.03.2012
Сообщений: 24
|
||||||
02.03.2012, 13:49 [ТС] | 24 | |||||
Текущий вариант функций:
Код
kravensky@kravensky-desktop ~ $ g++ -c -o demo.o demo_program.cpp In file included from demo_program.cpp:3:0: function.cpp: In function ‘std::ofstream& operator<<(std::ofstream&, square_matrix)’: function.cpp:58:26: warning: ISO C++ says that these are ambiguous, even though the worst conversion for the first is better than the worst conversion for the second: /usr/include/c++/4.5/bits/ostream.tcc:105:5: note: candidate 1: std::basic_ostream<_CharT, _Traits>& std::basic_ostream<_CharT, _Traits>::operator<<(int) [with _CharT = char, _Traits = std::char_traits<char>] function.cpp:56:11: note: candidate 2: std::ofstream& operator<<(std::ofstream&, square_matrix)
0
|
40 / 40 / 7
Регистрация: 21.02.2012
Сообщений: 95
|
|
02.03.2012, 14:01 | 25 |
а что ты имеешь ввиду под равенством потоков?)
речь шла о сравнении потоков, по какому признаку они сравнивались в языке - другой вопрос. я привел пример с this, если в НОВОМ стандарте возврат this не гарантирован значит вернется некий "другой" уникальный идентификатор, по которому и пройдет сравнение. ну а для системы они в любом случае 2 разных потока и вряд ли язык в какой либо реализации станет противоречить этому
0
|
5828 / 3479 / 358
Регистрация: 08.02.2010
Сообщений: 7,448
|
|
02.03.2012, 14:06 | 26 |
https://www.cyberforum.ru/post2545662.html
где это ты вычитал про «уникальность идентификатора»? Я еще раз повторю, если в некоторой реализации в булевом контексте будет всегда возвращаться (void*) 100500 вообще для всех незафейленных потоков, то это поведение уже будет соответствовать стандарту
0
|
40 / 40 / 7
Регистрация: 21.02.2012
Сообщений: 95
|
|
02.03.2012, 14:13 | 27 |
Nameless One,
про уникальность идентификатора потока..ну например в API твоей системы. а тебя послушать так язык с его библиотекой будет противоречить устройству той системы на которой будет запускаться, давая идентичные идентификаторы для разных потоков и делая невозможных их различение. проведи тест. посмотри что в регистрах при сравнениях будет
0
|
5828 / 3479 / 358
Регистрация: 08.02.2010
Сообщений: 7,448
|
|
02.03.2012, 14:17 | 28 |
еще раз, скажи, где ты вычитал, что "operator
при чем тут регистры вообще?
0
|
40 / 40 / 7
Регистрация: 21.02.2012
Сообщений: 95
|
|
02.03.2012, 14:20 | 29 |
а все я понял. ты про это? это лишь предположение базирующееся на том что потоки они уникальны в системе, а так же на том
что в "старом" стандарте при операции сравнения дергался operator void*(), возвращавший либо 0 либо this регистры при том, что там ты увидишь искомое значение, которое поможет тебе понять чем отличается cin от cout при их сравнении через ==
0
|
Диссидент
27706 / 17322 / 3812
Регистрация: 24.12.2010
Сообщений: 38,979
|
|||||||||||
02.03.2012, 14:20 | 30 | ||||||||||
Kravensky, А чего б тебе не попробовать такой код
Вообще, если б это был просто Си, я бы ответил ДА.
0
|
5828 / 3479 / 358
Регистрация: 08.02.2010
Сообщений: 7,448
|
|
02.03.2012, 14:29 | 31 |
я тебе говорю, что конкретная реализация может возвращать this, но на это надеяться нельзя, т.к. такое поведение не гарантировано. Единственной причиной того, что компилятор не считает выражение типа stream1 == stream2 (напомню, что operator == для потоков не определен) за ошибку, является тот факт, что в булевом контексте у потоков вызывается "operator unspecified-bool-type () const;", единственное предназначение которого — проверить, не случилось ли с потоком ничего плохого.
1
|
0 / 0 / 0
Регистрация: 01.03.2012
Сообщений: 24
|
|
02.03.2012, 14:31 [ТС] | 32 |
Байт, я ж в первоначальном варианте пробовал. Но, судя по прошлым постам темы, большинство сходится в том, что так делать нельзя. И, так как я сейчас на эксперименты не настроен, предпочитаю более понятный лично мне метод - перегрузку. Но как перегрузить на конкретный параметр, я не знаю.
0
|
5828 / 3479 / 358
Регистрация: 08.02.2010
Сообщений: 7,448
|
|
02.03.2012, 14:32 | 33 |
1
|
40 / 40 / 7
Регистрация: 21.02.2012
Сообщений: 95
|
||||||
02.03.2012, 14:44 | 34 | |||||
Kravensky,
в с++ при сравнении указателей - те же гарантии
2
|
0 / 0 / 0
Регистрация: 01.03.2012
Сообщений: 24
|
||||||
02.03.2012, 14:54 [ТС] | 35 | |||||
Luke, дык в c++ потоки не указателями реализуются, вроде. А классами.
0
|
40 / 40 / 7
Регистрация: 21.02.2012
Сообщений: 95
|
|
02.03.2012, 14:58 | 37 |
0
|
Диссидент
27706 / 17322 / 3812
Регистрация: 24.12.2010
Сообщений: 38,979
|
||||||
02.03.2012, 15:06 | 38 | |||||
Ну да. А в Си - структурами. Но экземпляр потока будет указателем на некую область памяти. в Си, во всяком случае. Чем будет stream-поток в плюсах, я не разбирался. Но кажется
Если я не прав, пусть товарищи меня поправят.
1
|
0 / 0 / 0
Регистрация: 01.03.2012
Сообщений: 24
|
|
02.03.2012, 15:07 [ТС] | 39 |
BRcr, не помогло, к сожалению.
0
|
02.03.2012, 15:12 | 40 |
Kravensky, если вам надо только cout и еще какой-то один поток отличать, тогда сравнение по адресу cout, как предложил Luke, является, пожалуй, простейшим вариантом.
1
|
02.03.2012, 15:12 | |
02.03.2012, 15:12 | |
Помогаю со студенческими работами здесь
40
Как можно сравнивать 2 файла по названию Можно ли сравнивать два метода, вычисляющих площадь? Откуда взять ряд с которым можно сравнивать? Как можно сравнивать поля двух подчиненных форм? Искать еще темы с ответами Или воспользуйтесь поиском по форуму: |