900 / 477 / 93
Регистрация: 10.06.2014
Сообщений: 2,698
|
||||||
1 | ||||||
Что означает решетка внутри макроса?10.07.2017, 19:54. Показов 4761. Ответов 17
Метки нет (Все метки)
Нашёл код, там внутри макроса используются решетки. Что это означает? Если объясните сам код вообще было бы круто!
0
|
10.07.2017, 19:54 | |
Ответы с готовыми решениями:
17
Что означает слово struct внутри объявления структуры? Что означает "Нельзя изменять значение переменной цикла внутри этого цикла"? Define внутри макроса Использование списка внутри макроса |
Заблокирован
|
|
10.07.2017, 19:55 | 2 |
Конкатенацию токенов. https://gcc.gnu.org/onlinedocs... ation.html
1
|
900 / 477 / 93
Регистрация: 10.06.2014
Сообщений: 2,698
|
|
10.07.2017, 19:58 [ТС] | 3 |
Судя по всему решетка задаёт остаток имени. Но почему именно ##X? Это синтаксис такой или можно и по другому ?
0
|
What a waste!
1610 / 1302 / 180
Регистрация: 21.04.2012
Сообщений: 2,733
|
|
10.07.2017, 20:00 | 4 |
# - преобразует идентификатор в строковый литерал.
## - конкатенация. en.cppreference.com/w/cpp/preprocessor/replace. См. # and ## operators.
1
|
900 / 477 / 93
Регистрация: 10.06.2014
Сообщений: 2,698
|
|
10.07.2017, 20:07 [ТС] | 5 |
daun-autist, gray_fox,
Круто, спасибо! Попытаюсь разобрать код на основе полученных знаний, но если кто то решит пояснить буду только рад!
0
|
Заблокирован
|
||||||
10.07.2017, 20:10 | 6 | |||||
Undisputed, что тут разбираться?
Раскрытие макроса CREATE_MEMBER_DETECTOR(first); превращается в определение шаблона класса
## нужно чтобы токены Detect_ и first были объединены в один токен Detect_first
0
|
900 / 477 / 93
Регистрация: 10.06.2014
Сообщений: 2,698
|
|
10.07.2017, 20:12 [ТС] | 7 |
daun-autist,
Я про логику в коде. Например не понятно зачем там два массива char которые состоят из 1 и 2 элементов
0
|
What a waste!
1610 / 1302 / 180
Регистрация: 21.04.2012
Сообщений: 2,733
|
|
10.07.2017, 20:38 | 8 |
Undisputed, данный макрос разворачиватся в type_trait для определения наличия члена класса.
Ещё pre-C++11, сейчас можно и покороче написать. Добавлено через 9 минут Там два шаблона функций. Первый инстанциируется, если у T есть член X. Иначе второй (у функций с элипсисом наименьший приоритет - это fallback). Два массива char нужны для того, что бы понять, какой из этих шаблонов функций инстанциировался (за счёт sizeof). Добавлено через 13 минут Сейчас можно использовать специализацию c void_t: http://en.cppreference.com/w/cpp/types/void_t. Добавлено через 1 минуту Хотя, конечно, для каждого члена класса и т.д. придётся так же иметь отдельный класс.
1
|
Заблокирован
|
||||||
10.07.2017, 20:39 | 9 | |||||
Для определения того, какой из шаблонов функции
func был выбран в func<Derived>(0) .Попытаюсь ниже не соврать. Если в типе T (в частности, здесь это Pair a.k.a. std::pair<int, double> ) есть член X (здесь first или second ), то шаблон
func<Derived>(0) , т.к. будет неясно, какой из Derived::X (Derived::first ) имеется в виду в &U::X , будет ambiguity. Но мы знаем, что substitution failure is not an error, поэтому этот шаблон просто удалится из кандидатов и будет выбран второй шаблон.Если же в типе T нет члена X , то при выборе первого шаблона не возникнет неоднозначности с тем, на какое из полей ссылается U::X .Правильно. Только наоборот.
2
|
What a waste!
1610 / 1302 / 180
Регистрация: 21.04.2012
Сообщений: 2,733
|
|
10.07.2017, 20:45 | 10 |
0
|
Заблокирован
|
|
10.07.2017, 20:48 | 11 |
Я тут неаккуратно написал: будет не ясно,
T::X или Fallback::X имеется в виду.Короче, вы понели.
0
|
900 / 477 / 93
Регистрация: 10.06.2014
Сообщений: 2,698
|
|
10.07.2017, 22:00 [ТС] | 12 |
daun-autist,
в мейне почему то проверяется если оба вызова инстанциировали шаблон с эллипсисом, тогда это pair. А нам же нужно наоборот т.к именно шаблон без эллипсиса определяет наличие нужного члена класса. Но это работает)) видимо я чего то не догоняю Добавлено через 4 минуты Помоему шаблон без эллипсиса больше подходит для того чтоб определить есть в классе искомый член или нет Но раз работает наверное я ошибаюсь...просто параметры этого шаблона визуально выглядят более подходящими
0
|
Заблокирован
|
||||||
10.07.2017, 22:48 | 13 | |||||
Undisputed, я же вроде всё расписал довольно подробно...
Когда в типе T есть член с именем X, то в Derived, унаследованном от Fallback (в котором тоже есть член X) и T, возникают два члена X: T::X и Fallback::X. И в шаблоне
U::X = Derived::X возникает неоднозначность с тем, на какой X — T::X и Fallback::X — ссылаются. Из-за этой неоднозначности шаблон исключается из списка кандидатов.
1
|
900 / 477 / 93
Регистрация: 10.06.2014
Сообщений: 2,698
|
|
10.07.2017, 23:05 [ТС] | 14 |
daun-autist,
Вот оно что. Теперь понятно, спасибо. Добавлено через 3 минуты Просто обычно ошибки вроде ambiguous приводят к ошибке компиляции, но в данном случае кандидат на инстанциирование просто отбрасывается. С этой точки зрения об этом я даже и не задумался
0
|
Заблокирован
|
|
10.07.2017, 23:10 | 15 |
Это называется SFINAE.
Добавлено через 1 минуту T::X или Fallback::X
0
|
|
12.07.2017, 09:40
#16
|
Не по теме: Как-то я свалил терминологию из инстанциации шаблонов и выбора перегруженной функции в одну кучу. Ну да ладно.
0
|
116 / 4 / 0
Регистрация: 05.06.2019
Сообщений: 62
|
||||||
30.03.2020, 21:40 | 17 | |||||
Не понятно что значит Fallback::* ?
* указатель на тип Fallback? Если да, то где имя указателя? Обычно например пишут int *p, что означает что это указатель на тип int и имя указателя, а здесь как?
0
|
19409 / 10028 / 2443
Регистрация: 30.01.2014
Сообщений: 17,678
|
||||||
30.03.2020, 21:47 | 18 | |||||
Неверно читаете.
Не Fallback::* , а int Fallback::* - это указатель на нестатический член типа int класса Fallback.Это взятие адреса этого члена. typename U - будет int Fallback::* Вот здесь, оно опущено за ненадобностью:
1
|
30.03.2020, 21:47 | |
30.03.2020, 21:47 | |
Помогаю со студенческими работами здесь
18
Подпрограммы (RCALL) внутри макроса Выполнение макроса внутри диалогового окна Excel Что означает появление письменности (языка), и что означает реформа письменности (языка)? Поясните пожалуйста что означает двоеточие и то что идет после него Искать еще темы с ответами Или воспользуйтесь поиском по форуму: |