|
Пятничная шабонная магия
|
|||
---|---|---|---|
#18+
a guestrdb_devНикак не могу разглядеть - в каком месте тут UB?Да никто и не говорил, что UB из-за каста нуля к указателю. Ты, похоже, вообще не понимаешь, что тебе пишут.Алилуия! Я надеюсь, п.1 параграфа 4.11 стандарта достаточно доходчиво объясняет что, к чему и как может быть приведено? ... |
|||
:
Нравится:
Не нравится:
|
|||
04.04.2018, 01:50 |
|
Пятничная шабонная магия
|
|||
---|---|---|---|
#18+
Anatoly MoskovskyПохоже нет смысла продолжать. ))Ну еще бы!... Напомни еще разок, что так к чему приводить - UB? :) ... |
|||
:
Нравится:
Не нравится:
|
|||
04.04.2018, 02:03 |
|
Пятничная шабонная магия
|
|||
---|---|---|---|
#18+
Anatoly Moskovskyrdb_devЕще не могу понять Похоже нет смысла продолжать. ))На счёт "deduction" nullptr для выбора void f(char*) соглашусь - вчера затупил... :) Но на счет якобы UB при конвертации (size_t)0 к типизированному указателю на экземпляр структуры/класса/члена совершенно не согласен. ... |
|||
:
Нравится:
Не нравится:
|
|||
04.04.2018, 09:33 |
|
Пятничная шабонная магия
|
|||
---|---|---|---|
#18+
rdb_devНо на счет якобы UB при конвертации (size_t)0 к типизированному указателю на экземпляр структуры/класса/члена совершенно не согласен. UB не тут. Но смысла дальше объяснять нет, т.к. уже не раз пытались. Кто захотел - понял, а кто не понял тот поймет ))) ... |
|||
:
Нравится:
Не нравится:
|
|||
04.04.2018, 11:34 |
|
Пятничная шабонная магия
|
|||
---|---|---|---|
#18+
Anatoly Moskovsky, подытожим? :) Anatoly Moskovskyrdb_dev"&((C*)0)->Get" - это что? Амперсанд (взятие адреса) видим? где здесь доступ к члену экземпляра класса (чтение свойства/вызов метода) по нулевому указателю экземпляра? Согласно стандарту, E1->E2 эквивалентно (*(E1)).E2 Таким образом "->" это в том числе и разыменование указателя. В стандарте (всех версий), разыменование нулевого указателя упоминается как пример UB. (С++17 8.3.2.5)По очевидным причинам, в личном пользовании у меня нет стандарта C++17, поэтому я пользую draft N4659. Привожу абзац полностью: " 8.2.5 Class member access [expr.ref] 1 A postfix expression followed by a dot . or an arrow ->, optionally followed by the keyword template (17.2), and then followed by an id-expression , is a postfix expression. The postfix expression before the dot or arrow is evaluated; 67 the result of that evaluation, together with the id-expression, determines the result of the entire postfix expression. 2 For the first option (dot) the first expression shall be a glvalue having complete class type. For the second option (arrow) the first expression shall be a prvalue having pointer to complete class type. The expression E1->E2 is converted to the equivalent form (*(E1)).E2 ; the remainder of 8.2.5 will address only the first option (dot). 68 In either case, the id-expression shall name a member of the class or of one of its base classes. [ Note: Because the name of a class is inserted in its class scope (Clause 12), the name of a class is also considered a nested member of that class. — end note ] [ Note: 6.4.5 describes how names are looked up after the . and -> operators. — end note ] ------------------------------------- 67) If the class member access expression is evaluated, the subexpression evaluation happens even if the result is unnecessary to determine the value of the entire postfix expression, for example if the id-expression denotes a static member. 68) Note that (*(E1)) is an lvalue." Никакого доступа к члену класса в данном контексте нет, так как и E1->E2, и (*(E1)).E2, это, всего лишь, место в памяти. Конечно, если упомянутые выражения я использую в неизменном виде как rvalue или lvalue, при том, что в E1 будет nullptr, то получу UB, а на винде даже page fault, но при "evaluation" выражения с оператором взятия адреса (&), rvalue уже не будет являться доступом к экземпляру класса и/или члену экземпляра. Стандарт же не идиоты писали! ... |
|||
:
Нравится:
Не нравится:
|
|||
04.04.2018, 13:46 |
|
Пятничная шабонная магия
|
|||
---|---|---|---|
#18+
Я надеваю свой шаблонный плащ и шаблонную шляпу... Слушайте, можно как-нибудь сделать перечисление/цикл по типам? К примеру, схематично, надо так: Код: plaintext 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16.
Это можно сделать с рекурсивными шаблонами, но громоздко получается. У меня есть некоторые структуры типов данных, которые завязаны на типы, т.е. дублируются по ним (int, float, ...) и почти функционалом не отличаются (atoi, atof, etc.). Но отдельных функций работы с ними много и они большие(циклы, перевызовы других функций, логика разбора), поэтому рекурсивное определение шаблонов тут вообще неудобно делать. Вот и думаю, как бы это сделать. У Александреску вроде было что-то такое в Локи, но не уверен, что оно сильно от рекурсивного объявления отличается. ... |
|||
:
Нравится:
Не нравится:
|
|||
29.09.2018, 10:38 |
|
Пятничная шабонная магия
|
|||
---|---|---|---|
#18+
CEMb, Тебе нужны boost::mpl::vector и boost::mpl::for_each. ... |
|||
:
Нравится:
Не нравится:
|
|||
29.09.2018, 10:54 |
|
Пятничная шабонная магия
|
|||
---|---|---|---|
#18+
NekZ, о, спасибо, не знал, что такое есть. В сопутствующей доке этого не нашёл (в интернете есть). У меня там основная проблема была в выносе кода в отдельные функции. Всё-таки не поленился и вынес... ... |
|||
:
Нравится:
Не нравится:
|
|||
02.10.2018, 05:09 |
|
Пятничная шабонная магия
|
|||
---|---|---|---|
#18+
CEMb, Советую к прочтению Advanced Metaprogramming in Classic C++ by Davide Di Gennaro . Там такие финты ушами описаны, после которых и жить не хочется, когда ты знаешь что где-то это может применяться. У тебя сразу все вопросы отпадут касательно реализации Boost MPL. ... |
|||
:
Нравится:
Не нравится:
|
|||
02.10.2018, 07:15 |
|
Пятничная шабонная магия
|
|||
---|---|---|---|
#18+
NekZТам такие финты ушами описаны, после которых и жить не хочется, когда ты знаешь что где-то это может применяться. У тебя сразу все вопросы отпадут касательно реализации Boost MPL. Хм, это интересно :) Мне где-то попадались финты: люди сделали тетрис в потоке отладки сборки проекта ... |
|||
:
Нравится:
Не нравится:
|
|||
03.10.2018, 05:39 |
|
Пятничная шабонная магия
|
|||
---|---|---|---|
#18+
CEMbNekZ, о, спасибо, не знал, что такое есть. В сопутствующей доке этого не нашёл (в интернете есть). У меня там основная проблема была в выносе кода в отдельные функции. Всё-таки не поленился и вынес...Если мне не изменяет память, for_each вкрячили в стандарт C++14. В GCC он точно есть. ... |
|||
:
Нравится:
Не нравится:
|
|||
03.10.2018, 09:25 |
|
Пятничная шабонная магия
|
|||
---|---|---|---|
#18+
rdb_devЕсли мне не изменяет память, for_each вкрячили в стандарт C++14. В GCC он точно есть. for_each по вектору из типов ? ... |
|||
:
Нравится:
Не нравится:
|
|||
03.10.2018, 09:27 |
|
Пятничная шабонная магия
|
|||
---|---|---|---|
#18+
NekZ, Цитата из stl_algo.h (#include <algorithm>) Код: plaintext 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17. 18. 19. 20. 21. 22. 23.
... |
|||
:
Нравится:
Не нравится:
|
|||
03.10.2018, 10:06 |
|
Пятничная шабонная магия
|
|||
---|---|---|---|
#18+
rdb_devNekZ, Цитата из stl_algo.h (#include <algorithm>) Код: plaintext 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17. 18. 19. 20. 21. 22. 23.
Проблема только в том, что это не имеет никакого отношения к теме и существует с допотопных времён. Здесь-то нужен цикл по вектору типов в compile-time, в то время как обычный std::for_each выполняется в рантайме и не по типам совсем. boost::mpl::for_each является шаблонным типом, а не функцией. ... |
|||
:
Нравится:
Не нравится:
|
|||
03.10.2018, 10:49 |
|
Пятничная шабонная магия
|
|||
---|---|---|---|
#18+
У меня вопрос про специализацию метода шаблона. Если делаю так, в заголовке: Код: plaintext 1. 2. 3. 4. 5. 6. 7. 8. 9.
Всё ок. Но не хочу городить код в описании класса, так как конструктор большой, поэтому хочу вынести описание общего конструктора за скобки: Код: plaintext 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12.
сразу получаю ошибку от линкера, что тело уже определено во всех объектниках, где шаблон используется если вынести специализацю в cpp(вроде это же явный код, там ему и место) - тоже ошибка линкера, но другая, но смысл тот же, функция уже определена спасает только внос основного конструктора в описание класса-шаблона. чую, какой-то абсолютно тупой косяк, но понять не могу и почему оно собирается, когда специализация находится в заголовочном файле? ... |
|||
:
Нравится:
Не нравится:
|
|||
18.11.2018, 11:56 |
|
Пятничная шабонная магия
|
|||
---|---|---|---|
#18+
Код: plaintext 1. 2.
И это MS VC++17 ... |
|||
:
Нравится:
Не нравится:
|
|||
18.11.2018, 12:04 |
|
Пятничная шабонная магия
|
|||
---|---|---|---|
#18+
CEMbесли вынести специализацю в cppто код для не неё не собирается. Странно. ... |
|||
:
Нравится:
Не нравится:
|
|||
18.11.2018, 12:15 |
|
Пятничная шабонная магия
|
|||
---|---|---|---|
#18+
CEMbесли вынести специализацю в cpp(вроде это же явный код, там ему и место) если хочешь, чтобы конструктор для специализации был в cpp попробуй вынести в cpp Код: plaintext 1.
... |
|||
:
Нравится:
Не нравится:
|
|||
18.11.2018, 13:51 |
|
Пятничная шабонная магия
|
|||
---|---|---|---|
#18+
CEMb, Ни разу не видел чтобы так кто-то писал. Даже сложно понять чего ты этим хотел добиться Код: plaintext 1. 2. 3. 4. 5.
Это тоже какая-то лажа, у тебя же не template-конструктор, а класс: Код: plaintext 1. 2. 3.
Почему не так? Код: plaintext 1. 2. 3.
В общем таким должен быть хедер: Код: plaintext 1. 2. 3. 4. 5.
А таким cpp-шник: Код: plaintext 1. 2. 3.
А заодно, раз уж ты ограничиваешь инстанциации шаблона, то сделай это на уровне компилятора, а не линкера, либо через SFINAE, либо явным путём всех возможных специализаций всего класса в хедере. ... |
|||
:
Нравится:
Не нравится:
|
|||
18.11.2018, 14:24 |
|
Пятничная шабонная магия
|
|||
---|---|---|---|
#18+
NekZПочему не так?Оно так и есть, просто я торопился :) NekZВ общем таким должен быть хедер:ну вот оно так не собирается, про это и был воспрос. NekZА заодно, раз уж ты ограничиваешь инстанциации шаблона, то сделай это на уровне компилятора, а не линкера, либо через SFINAE, либо явным путём всех возможных специализаций всего класса в хедере.Мне нужно просто переопределить один метод для одного типа(в качестве параметра шаблона). SFINAE, конечно, можно приделать, но это слишком для такой простой ситуации. Мне надо вот, как тут , но код общей функции print вынести из описания класса. ... |
|||
:
Нравится:
Не нравится:
|
|||
18.11.2018, 16:34 |
|
Пятничная шабонная магия
|
|||
---|---|---|---|
#18+
NekZА таким cpp-шник:А, да, если код в cpp - он не собирается, т.е. компилятор его игнорирует. ... |
|||
:
Нравится:
Не нравится:
|
|||
18.11.2018, 16:43 |
|
Пятничная шабонная магия
|
|||
---|---|---|---|
#18+
CEMbNekZА таким cpp-шник:А, да, если код в cpp - он не собирается, т.е. компилятор его игнорирует. Друг, ну что за формулировки? Наверное, ты имел в виду линкер? Кстати, можно было бы попробовать трюк с extern template. ... |
|||
:
Нравится:
Не нравится:
|
|||
19.11.2018, 07:54 |
|
Пятничная шабонная магия
|
|||
---|---|---|---|
#18+
NekZДруг, ну что за формулировки? Наверное, ты имел в виду линкер?Нет, именно компилятор. Конечного(скомпилированного) кода нет. Если я ставлю в cpp-коде брекпоинт, среда его убирает с формулировкой, что по этому cpp-коду не было ничего собрано. Тогда как брекпоинт в заголовке ставится и отрабатывает - код есть. NekZКстати, можно было бы попробовать трюк с extern template.Нет, надо разобраться в вопросе :) Там должно быть всё просто. Я сейчас возьму таймаут(много работы) и чуть позже спокойно посмотрю, почему оно так и как оно должно быть. А пока сделаю, чтоб просто работало :} ... |
|||
:
Нравится:
Не нравится:
|
|||
20.11.2018, 05:34 |
|
Пятничная шабонная магия
|
|||
---|---|---|---|
#18+
CEMbЯ сейчас возьму таймаут(много работы) и чуть позже спокойно посмотрю Код: plaintext 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15.
вопрос: почему оно не работает без using A1:fn? При чём тут шаблоны? Когда я пишу класс-шаблон с переменным числом шаблонных параметров, у меня в нём есть одинаковый метод-шаблон, который хочется видеть из всех итераций класса. Но как для него написать using? ... |
|||
:
Нравится:
Не нравится:
|
|||
20.05.2019, 06:21 |
|
Пятничная шабонная магия
|
|||
---|---|---|---|
#18+
код для большего понимания ситуации: Код: plaintext 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17. 18. 19. 20. 21. 22. 23. 24. 25. 26. 27. 28. 29.
Код: plaintext 1. 2. 3. 4. 5. 6.
Вот если ParamGet не шаблон, то using Params<TS...>::ParamGet; добавляет видимости методам из классов-предков, и всё становится ок. Как написать правильный uning, чтобы это работало с шаблонами. PS: можно написать !is_same<TE, T1> и прокидывать методы из предков, но тогда возникают неприятные предупреждения компилятора о множественных реализациях. PPS: если до вечера не найду решение, то буду использовать передачу параметра в функцию и неявную специализацию. И страдать от того, что всё в две строчки, а могло быть в одну. ... |
|||
:
Нравится:
Не нравится:
|
|||
20.05.2019, 09:25 |
|
|
start [/forum/topic.php?fid=57&msg=39734810&tid=2017587]: |
0ms |
get settings: |
9ms |
get forum list: |
12ms |
check forum access: |
3ms |
check topic access: |
3ms |
track hit: |
36ms |
get topic data: |
9ms |
get forum data: |
3ms |
get page messages: |
59ms |
get tp. blocked users: |
1ms |
others: | 14ms |
total: | 149ms |
0 / 0 |