Этот баннер — требование Роскомнадзора для исполнения 152 ФЗ.
«На сайте осуществляется обработка файлов cookie, необходимых для работы сайта, а также для анализа использования сайта и улучшения предоставляемых сервисов с использованием метрической программы Яндекс.Метрика. Продолжая использовать сайт, вы даёте согласие с использованием данных технологий».
Политика конфиденциальности
|
|
|
Определение по типу переменной, в которую возвращается значение
|
|||
|---|---|---|---|
|
#18+
Есть такая примерная иерархия классов: Код: plaintext 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. Можно ли как-то написать функцию Get, чтобы можно было вызывать так: Код: plaintext 1. 2. 3. 4. ? У меня получилось максимум сделать функцию-шаблон, куда передаётся тип класса (A,B,C) и из него возвращается соответствующая переменная. Но в общем случае мы не видим связь между именем класса и типом переменной. Наверно, можно попробовать сделать иерархию на основе шаблона класса, куда передавать тип (typeA, typeB, typeC), но не совсем понятно, как. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 24.04.2017, 09:20 |
|
||
|
Определение по типу переменной, в которую возвращается значение
|
|||
|---|---|---|---|
|
#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. 30. 31. 32. 33. 34. 35. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 24.04.2017, 10:07 |
|
||
|
Определение по типу переменной, в которую возвращается значение
|
|||
|---|---|---|---|
|
#18+
CEMbЕсть такая примерная иерархия классов: Код: plaintext 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. Можно ли как-то написать функцию Get, чтобы можно было вызывать так: Код: plaintext 1. 2. 3. 4. ? У меня получилось максимум сделать функцию-шаблон, куда передаётся тип класса (A,B,C) и из него возвращается соответствующая переменная. Но в общем случае мы не видим связь между именем класса и типом переменной. Наверно, можно попробовать сделать иерархию на основе шаблона класса, куда передавать тип (typeA, typeB, typeC), но не совсем понятно, как. Обычный статический метод тебе тут подойдёт. Правда, код будет малополезен. Он будет малополезен в любом случае, везде тебе нужно будет явно в вызове указывать статический тип класса, которого ты хочешь узнать "тип". Динамический тип у тебя везде тут C, и статический тип переменной -- С. Ещё вариант -- простая невиртуальная функция с явным приведением типа при вызове или явным указанием скоупа класса при вызове. Эффект будет тот же -- тип придётся указывать, и толку в том, что ты вызовешь ещё функцию -- ноль. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 24.04.2017, 10:48 |
|
||
|
Определение по типу переменной, в которую возвращается значение
|
|||
|---|---|---|---|
|
#18+
CEMbУ меня получилось максимум сделать функцию-шаблон, куда передаётся тип класса (A,B,C) и из него возвращается соответствующая переменная. Но в общем случае мы не видим связь между именем класса и типом переменной. Наверно, можно попробовать сделать иерархию на основе шаблона класса, куда передавать тип (typeA, typeB, typeC), но не совсем понятно, как. Не понятно вообще, что ты тут хочешь. Получить тип класса, тип которого ты уже и так знаешь ? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 24.04.2017, 10:50 |
|
||
|
Определение по типу переменной, в которую возвращается значение
|
|||
|---|---|---|---|
|
#18+
SiemarglНе, это не то MasterZivПолучить тип класса, тип которого ты уже и так знаешь ?да, но сделать менее перегруженный код. Т.е, как я уже писал, работает в таком виде: Код: plaintext 1. 2. 3. 4. но приходится 2 раза указывать класс. можно, наверно, сверху обернуть шаблоном, который будет 2 раза этот тип указывать, чтобы наружу ничего не торчало. можно (точно) делать фунцию Get и параметром передавать туда переменную требуемого типа. Но тогда придётся в одну строку писать декларацию, во вторую вызов Get. И я не смогу возвращать ссылки, а хотелось бы. И кроме того, я ж могу ошибиться и написать: Код: plaintext 1. 2. 3. 4. и если есть касты между типами, я это так и не замечу при компиляции ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 24.04.2017, 11:12 |
|
||
|
Определение по типу переменной, в которую возвращается значение
|
|||
|---|---|---|---|
|
#18+
CEMb, Код: plaintext 1. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 24.04.2017, 11:26 |
|
||
|
Определение по типу переменной, в которую возвращается значение
|
|||
|---|---|---|---|
|
#18+
... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 24.04.2017, 11:36 |
|
||
|
Определение по типу переменной, в которую возвращается значение
|
|||
|---|---|---|---|
|
#18+
CEMbДаже нечего возразить А ты усложни задачу, введя указатели. Слабо написать так: Код: sql 1. Posted via ActualForum NNTP Server 1.5 ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 24.04.2017, 12:17 |
|
||
|
Определение по типу переменной, в которую возвращается значение
|
|||
|---|---|---|---|
|
#18+
Dimitry SibiryakovА ты усложни задачуя ещё толком на шаблонах первый вариант не написал, и у меня цель не усложнять, а упрощать :) Проблема с шаблонами в том, что при вызове мы совсем не знаем, из какого типа нам звать функцию Get. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 24.04.2017, 12:33 |
|
||
|
Определение по типу переменной, в которую возвращается значение
|
|||
|---|---|---|---|
|
#18+
Проблема вот в чём. Мы хотим иметь более общий вариант описания объекта, чтобы не заводить кучу иерархий классов на каждую цепочку. Т.е. чтобы объявлять так: Код: plaintext 1. или ещё как изначально задумка была сделать класс, который можно наполнять любыми данными и получать их одной и той же функцией, определяя тип возвращаемого значения по типу переменной, что стоит слева(ещё более изначальная задумка была разделить данные в классе так, чтобы различные блоки кода могли обращаться только к своим типам данных извне, и всё работало быстро со статической типизацией) я надеваю свой шаблонный плащ и шаблонную шляпу... Код: plaintext 1. 2. 3. 4. 5. 6. 7. 8. 9. всё ок, но тип мы определить не можем тут: Код: plaintext 1. 2. 3. Потому что у нас нету типа D<int> в иерархии, только D<string> и D<int, string> и извлечь из второго правильный тип для переменной a_ не получится (я сделал variadic template и для функции и несколько раз уронил компилятор,... но на вид это решило бы проблему совместимости типов, хотя и криво) Решение проблемы весьма изящно! Заводим ещё один шаблон, который будет нести информацию, а изначальный оставляем в качестве интерфейса: Код: plaintext 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 24.04.2017, 13:44 |
|
||
|
Определение по типу переменной, в которую возвращается значение
|
|||
|---|---|---|---|
|
#18+
CEMb, Это называется изящно??? Перегрузка по возвращаемому значению не зря же запрещена. Может надо было по старинке? Код: plaintext 1. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 24.04.2017, 14:48 |
|
||
|
Определение по типу переменной, в которую возвращается значение
|
|||
|---|---|---|---|
|
#18+
CEMb, Еще возможна такая конструкция. Код: plaintext 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17. 18. 19. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 24.04.2017, 15:32 |
|
||
|
Определение по типу переменной, в которую возвращается значение
|
|||
|---|---|---|---|
|
#18+
На всякий уточняю что я имел в виду, что ваш метод get() должен возвращать S, который умеет приводиться к нужному типу. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 24.04.2017, 15:42 |
|
||
|
Определение по типу переменной, в которую возвращается значение
|
|||
|---|---|---|---|
|
#18+
SiemarglЭто называется изящно???Ну да, довольно сложная конструкция, записанная в пять строчек. В чём и прелесть новых плюсов. Давайте разберёмся, что не так в этой конструкции?SiemarglПерегрузка по возвращаемому значению не зря же запрещена.А, кстати, почему? Сидел, вспоминал, так и не вспомнил причину. SiemarglМожет надо было по старинке?Да, можно и так, но я выше про это писал, тут есть 2 неудобства: запись в две строчки(decl + get), невозможность вернуть ссылку.Anatoly Moskovskyметод get() должен возвращать S, который умеет приводиться к нужному типунемного не совсем то. Т.е. как я понял, внутри S должны быть какие-то данные, в моём случае любые, int, vector<float>, string и потом как-то через operator T() должны кастоваться в T. Вот момент каста мне неясен. И у меня задумка другая: чёткая типизация. В 4-м посте я писал, что как раз стараюсь избежать любых кастов, чтобы автоматически избежать любых неявных ошибок. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 25.04.2017, 05:14 |
|
||
|
Определение по типу переменной, в которую возвращается значение
|
|||
|---|---|---|---|
|
#18+
CEMb Код: plaintext 1. И странно, что никто не сказал: "так это же tuple!" :) Да, но хотелось пойти немного дальше, использовать типы-параметры как типы для векторов(а не просто переменных), а так же сделать методы для работы с этими векторами напрямую, не извлекая вектор из класса, что с tuple невозможно. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 25.04.2017, 09:02 |
|
||
|
Определение по типу переменной, в которую возвращается значение
|
|||
|---|---|---|---|
|
#18+
CEMbнемного не совсем то. Т.е. как я понял, внутри S должны быть какие-то данные Нет. Там нужна всего лишь ссылка на c. А дальше вы сами писали что у вас CEMbработает в таком виде: Код: plaintext 1. 2. 3. 4. но приходится 2 раза указывать класс. Код: 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. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 25.04.2017, 09:26 |
|
||
|
|

start [/forum/topic.php?fid=57&msg=39443183&tid=2018186]: |
0ms |
get settings: |
11ms |
get forum list: |
15ms |
check forum access: |
4ms |
check topic access: |
4ms |
track hit: |
164ms |
get topic data: |
10ms |
get forum data: |
2ms |
get page messages: |
54ms |
get tp. blocked users: |
1ms |
| others: | 13ms |
| total: | 278ms |

| 0 / 0 |
