- 01
- 02
- 03
- 04
- 05
- 06
- 07
- 08
- 09
- 10
- 11
- 12
- 13
- 14
- 15
- 16
- 17
- 18
- 19
- 20
- 21
- 22
- 23
- 24
- 25
using System;
public interface IFoo
{
void WhoAmI<T>(T t);
}
public class Foo : IFoo
{
public void WhoAmI<T>(T t)
{
Console.WriteLine(t.GetType().FullName);
}
}
class pituh
{
public static int Main(string[] args)
{
var f = new Foo() as IFoo;
f.WhoAmI("asd");
f.WhoAmI(10);
return 0;
}
}
Antervis 28.03.2017 16:06 # +10
ASD_77 28.03.2017 17:56 # +10
Elvenfighter 29.03.2017 00:04 # 0
Иными словами, парочка #if с проверкой на компилятор/окружение должны решить вопрос c кросс-компиляторным demangle. Я почти уверен, что на GitHub (or whatever) уже можно найти рабочий код.
P.S. abi::__cxa_demangle дико бесит, что не constexpr. А ведь тип вполне себе известен на этапе компиляции. Такое ограничение не дает делать constexpr там, где надо получить имя типа...
bormand 29.03.2017 00:07 # 0
Elvenfighter 29.03.2017 01:39 # +1
Оператор, который генерирует литерал по имени типа. Что-то вида typeid.
bormand 29.03.2017 07:17 # 0
d_fomenok 25.10.2017 17:17 # +1
Скажи это комитету
huesto 28.03.2017 16:18 # 0
а ты часом не бароп?
ASD_77 28.03.2017 17:57 # +11
huesto 28.03.2017 19:56 # 0
ASD_77 28.03.2017 20:33 # +11
1024-- 28.03.2017 20:59 # +1
bormand 28.03.2017 22:41 # 0
ASD_77 28.03.2017 23:05 # +11
bormand 28.03.2017 23:08 # 0
ASD_77 28.03.2017 23:12 # +10
bormand 28.03.2017 23:13 # 0
И правильно сделает.
d_fomenok 12.05.2017 12:56 # −8
Что бы отменить что то, надо решить что то.
1024-- 28.03.2017 23:13 # 0
ASD_77 28.03.2017 23:17 # +10
1024-- 28.03.2017 23:22 # 0
ASD_77 28.03.2017 23:37 # +10
ну так скомпиляйте нам код. а мы посмотрим на него :)
1024-- 28.03.2017 23:41 # +1
ASD_77 28.03.2017 23:44 # +10
1024-- 28.03.2017 23:51 # 0
Да, общий случай никто не предскажет и не запилит пацанский пирфоманс. Печально.
d_fomenok 25.10.2017 17:20 # 0
Покаж
1024-- 25.10.2017 17:53 # +1
d_fomenok 25.10.2017 19:02 # 0
1024-- 27.10.2017 19:21 # +1
defecate-plusplus 28.03.2017 23:03 # 0
Ибо генерик вообще не шаблон, это сахарок над Foo<Object>.
В крестах же напротив, шаблонный метод виртуальным не сделать.
huesto 29.03.2017 16:11 # 0
defecate-plusplus 29.03.2017 16:32 # 0
раз две принципиально различные вещи для него должны быть сравнимы в категориях лучше-хуже
ASD_77 29.03.2017 17:19 # 0
на балуйся.
defecate-plusplus 29.03.2017 17:47 # +1
ну тогда другой пример - template specialization:
если кококомпилятор c# сохраняет информацию о типах, и сам по себе язык обмазан сахаром в 10 слоев, что им помешало реализовать такую несложную вещь, как частичная/полная специализация?
ну или аналог крестушкового template <int N, int M> class Matrix()
раз уж так хочется сравнить несравнимое
интересно послушать
huesto 29.03.2017 17:55 # 0
defecate-plusplus 29.03.2017 18:03 # 0
defecate-plusplus 29.03.2017 18:14 # 0
inho 29.03.2017 18:45 # −1
defecate-plusplus 29.03.2017 18:53 # +4
roman-kashitsyn 29.03.2017 19:03 # +5
inho 29.03.2017 19:16 # 0
Если пишет Стертор, то там будет про хуи, педиков, собак, или прочей шизни
doctor_stertor 12.05.2017 17:03 # 0
Пора бы уже научиться отличать меня.
TeaBag 14.05.2017 15:35 # 0
CrashTesterAnusov 14.05.2017 17:05 # +1
TeaBag 14.05.2017 19:20 # 0
doctor_stertor 14.05.2017 17:10 # 0
CrashTesterAnusov 14.05.2017 17:37 # 0
doctor_stertor 14.05.2017 18:05 # 0
CrashTesterAnusov 14.05.2017 18:13 # 0
doctor_stertor 14.05.2017 18:15 # 0
ASD_77 29.03.2017 19:20 # −1
defecate-plusplus 29.03.2017 19:37 # +3
такой dynamic cast даже в pl/sql есть, прости господи
а можно за O(0) всё таки - компилятор же знает о типе объекта, почему он не выбирает сразу правильную "перегрузку" из набора функций?
или про отсутствие type erasure маркетинговые презентации всё же немного подпёздывают?
ASD_77 29.03.2017 20:57 # 0
defecate-plusplus 29.03.2017 21:30 # +2
в жабе тоже если чего-то нет, оно нахер не нужно
d_fomenok 12.05.2017 12:59 # −8
Ты ёбнулся?
ASD_77 28.03.2017 23:04 # +10
там виртуальная функция для особо одаренных стоит что бы компелятор от с++ жидко обгадился когда начнет применять темплейты к фиртуальной функции
1024-- 28.03.2017 23:17 # 0
> делать не приходиться
> это бред - не говорят не люди не коты.
> что бы компелятор
> там виртуальная функция для особо одаренных стоит что бы компелятор от с++ жидко обгадился когда начнет применять темплейты к фиртуальной функции
Да это же вореционный бот, который своим кобенаторным алгоритмом осознал C++ до возможности написания своего буста, но русский язык учил по комментариям на Ютубе.
ASD_77 28.03.2017 23:40 # +10
Elvenfighter 29.03.2017 01:13 # +2
Static-C++ style. Ибо нефиг тут динамотой забавляться.
ASD_77 29.03.2017 10:59 # 0
похоже надо самому строить __vtbl и вызывать через номер метода типа __vtbl[0]
1024-- 29.03.2017 11:17 # +1
А если WhoAmI(const std::type_info&) захочет распечатать само значение, дать ему ссылку на IPrinter, которую создавать в WhoAmI(const T &t), пока тип и значение известны.
1024-- 29.03.2017 11:35 # +1
https://wandbox.org/permlink/OPyDQMgGd2aKj8K0
Elvenfighter 29.03.2017 13:28 # +1
Antervis 29.03.2017 15:11 # +1
Elvenfighter 29.03.2017 17:49 # 0
Antervis 30.03.2017 06:48 # +1
Antervis 29.03.2017 14:59 # 0
1024-- 29.03.2017 15:02 # 0
там виртуальная функция для особо одаренных стоит что бы компелятор от с++ жидко обгадился когда начнет применять темплейты к фиртуальной функции
Может, специально придумывал искусственную задачу, где C++ напрямую не работает как C#.
Antervis 29.03.2017 15:11 # 0
а остальное в цппшник. И не надо инстанцировать никакой хуеты
ASD_77 29.03.2017 15:35 # 0
huesto 29.03.2017 16:13 # +1
ASD_77 29.03.2017 17:15 # 0
huesto 29.03.2017 17:36 # 0
ASD_77 29.03.2017 21:00 # 0
ASD_77 29.03.2017 21:34 # −1
напишите код который будет работать
Да можеш заюзать Boost::any :)
huesto 30.03.2017 00:03 # 0
ASD_77 30.03.2017 01:27 # −1
Antervis 30.03.2017 06:59 # 0
Elvenfighter 30.03.2017 07:19 # 0
С другой стороны сделать то, что он хочет, довольно просто с помощью паттерна из моего первого примера (aka "curiously recurring template pattern")
defecate-plusplus 30.03.2017 09:45 # +1
Если учесть, что темплейт разворачивается (инстанциируется) только компилятором, и в рантайме инстанциированный темплейт это полноценный обособленный тип (или полноценная обособленная функция), которому в целом поебать, был ли он шаблонным когда-то, и кто его собратья и есть ли они вообще, при этом нет смысла хранить (мета?) код исходного темплейта - рантайму ничего с этим кодом не сделать, он не может и не должен в jit компиляцию какую-то, и новый код из xml или из сети он не сгенерит на лету (и тем более не прооптимизирует, не разберется со SFINAE, не найдет частичные специализации и т.д.) - то виртуальный шаблонный метод это оксюморон. Независимо от стандарта.
Для шарпо(и жабо)ёба интерфейс, походу, единственный контракт, о других они даже не слышали, им сложно принять то, что крестошаблон - это тоже контракт, как и то, что при развертывании кучи вложенных друг в друга шаблонов при обычных условиях компилятор выкинет к хуям информацию о всех промежуточных преобразованиях, получив только высокооптимизированный код, заточенный на конкретный тип.
Буквально недавно я генерил различные многомерные данные (статистика), которые беком должны были обернуться в 0-мерные (значение), 1-мерные (массив), 2-мерные (массив массивов), 3-мерные (...) структуры и отправиться на фронт для визуализации.
Что сделал жавоёб? Один тип для T, второй тип для List<T>, третий тип для List<List<T>>, четвертый для List<List<List<T>>>.
Помогли ему его интерфейсы с виртуальными генериками? Хуй там.
ASD_77 30.03.2017 10:53 # 0
defecate-plusplus 30.03.2017 11:06 # +1
виртуальный означает, что потомок будет переопределять когда-нибудь с тем же контрактом (имя+параметры)
это когда-нибудь может возникнуть в другой длл спустя 10 лет
базовый класс не может предугадать как потомок будет инстанциировать этот метод
что он может сохранить для потомка в данном случае?
только исходный код или AST или ещё какой-нибудь питух-байт-ллвм-код, и в таблице виртуальных методов эти самие питух-коды вообще в отдельные места складывать, т.к. это не исполняемые точки входа
и все потомки, переопределяющие этот шаблон своим таким же шаблоном, должны заменять родительский питух-байткод своим
чтобы когда-нибудь jit компилятор смог в рантайме проинстанциировать эту метушню в валидные исполняемые инструкции
ну или смириться с тем, что <T> это просто сраный сахарок над Object, и контракт этой виртуальной функции именно что принимаем/возвращаем Object, ну или void * - и в этом случае вообще никаких оптимизаций (код предка уже скомпилирован в бинарном виде и неизменяем) и тем более специализаций, максимум, проверки компилятора о типе возвращенного объекта (ещё один сахарок)
ASD_77 30.03.2017 11:22 # 0
defecate-plusplus 30.03.2017 11:32 # 0
Я всё ещё не пойму
Каждый шаблонный метод в крестах раскрывается в свою имплементацию сразу, как только компилятор видит необходимость в этом.
https://wandbox.org/permlink/N9ysRa2YhsT0d2SH
Затем все эти инстанциированные методы лягут в obj файл каждый под своим именем и адресом, чтобы линкер смог их в других модулях подставить в случае нужды.
Нет нужды в инстансе от, например, <char> - никто никакой код не сгенерит, и даже не подумает.
А в пределах единицы компиляции они вообще, скорее всего, заинлайнятся - тебе ведь обычно всё равно, являются ли они обособленными точками входа с каким то колл-конвеншеном, если тебе ни адреса не надо хранить, ничего, главное, чтобы они сделали "при вызове" то, что требуется. При инлайне компилятор их тело встроит в вызываемой код, перетасует, смешает с другими инструкциями, выкинет что-нибудь, и забудет, что это был шаблон какой-то какого-то класса foo, всё как обычно (для шарпера звучит диковато, понимаю).
Что именно ты собрался положить в ТВМ? Исходник шаблонного метода? Я об этом выше написал.
Т.к. спустя 10 лет я пишу свой тип MyAwesomeClass и инстанциирую им эту функцию, написанную кем-то 10 лет назад - какой код должен сгенерить компилятор за 10 лет до того, чтобы так заработало и потомком была найдена точка входа в подпрограмму foo::process<MyAwesomeClass>()?
ASD_77 30.03.2017 12:41 # −1
1) проблема - С++ не разрешает использовать виртуальные темплейтные методы. Почему? потому что компилятор не может предугадать какие параметры темлейты могу быть использованны и поэтому не может сгенерировать __vtbl соответсвенно. А почему он не может это сделать? Ответ: потому что __vtbl распологает методы по порядку 0, 1, 2 в зависимости от того что в декларации класса написанно.
Но все это можно было бы избежать если бы методы в __vtbl референсились не по порядку как в декларации написанно а например по Hash code от имени функции, И тогда больше бы не было проблем с виртуальными темплейтными методами потому что "derived" класс всегда бы знал куда нужно положить метод в виртуальную таблицу.
т.е. не референсить по имени как делают dynamic языки а по hash - и все бы были довольны
defecate-plusplus 30.03.2017 13:11 # +1
virtual void process<int> и virtual void process<double> это две разные подпрограммы.
У них у каждой свои точки входа, у них у каждой свое тело, они даже вправе делать абсолютно своё, независимое друг от друга, и знать друг о друге не хотят.
При этом никакой точки входа у virtual void process<T> нет, т.к. в принципе нет никакого исполняемого кода, который олицетворял собой "неинстанциированный шаблон". Нет никаких машинных инструкций, не сохраняется никакого интермидиед-результата (там компилятор максимум AST может построить в процессе первого этапа разбора, проверить синтаксис - и то старые вижуал студии хуй забивали на двухэтапный разбор шаблона, проверяли только второй этап, в момент подстановки конкретного типа). В единице выполнения (exe, dll) шаблона нет. Есть только инстансы с конкретными типами. Всё. У них нет никакой семейственности. В исполняемой программе в режиме release нет никакого реестра созданных ей типов, ничего такого. Всё байты, даже небо, даже аллах. Исполняемый код - машинные инструкции под конкретную архитектуру/ОС/процессор.
В _vtbl должны лечь указатели на подпрограммы в качестве значения куда делать call/jmp.
Для метода process<T> никакого указателя нет. Для инстансов методов process<int> и process<double> свои указатели. Что класть в __vtbl? Какой из них может переопределить потомок? Что будет, если потомок захочет третий вариант инстанциированного шаблона? Какого объема рантайм нужно притащить в исполняемую единицу, чтобы имея исходный код шаблона (и всего, от чего он зависит) на лету сформировать ещё один метод, не хуже тех двух скомпилированных и прооптимизированных в процессе сборки? Кто будет заниматься поиском адресов функций, которые могут быть вызваны из такого генерирующегося метода в зависимости от текущего Т? А если там тоже шаблонные функции?
ASD_77 30.03.2017 13:40 # −1
defecate-plusplus 30.03.2017 13:15 # 0
http://rextester.com/ZFW58650
ASD_77 30.03.2017 13:36 # 0
вот ближайшая имплементация которая может работать
defecate-plusplus 30.03.2017 13:44 # 0
ну наконец-то, спасибо!
> он не может кастить T в другой тип
Темплейт ничего не кастит.
Он использует переданное точное значение типа вместо Т по всему своему коду для того, чтобы скомпилировать (не исполнить!) самостоятельный тип/функцию/метод, со всеми вытекающими (поэтому будет работать и вызов правильной перегруженной функции, и все остальное. А вот исходного шаблона никакого не останется.
У меня всё.
ASD_77 30.03.2017 13:58 # 0
huesto 30.03.2017 15:43 # 0
doktor 30.03.2017 16:40 # +3
guest 13.04.2017 23:48 # −11
<a href=" http://cialis10mgprixenpharmacieenligne.com/ ">cialis 10mg prix en pharmacie en ligne </a>
guest 14.04.2017 00:41 # −11
<a href=" http://cialis20mgprixenpharmacierx.com/ ">cialis 20mg prix en pharmacie </a>
guest 14.04.2017 06:25 # −11
<a href=" http://achetercialisenfrancesitefiable.com/ ">acheter cialis generique en france </a>
guest 14.04.2017 12:42 # −11
<a href=" http://achetercialissansordonnanceenpharmacie.c om/ ">vente de cialis sans ordonnance en france </a>
guest 14.04.2017 12:45 # −11
<a href=" http://achatcialisenfrancelivraisonrapide.com ">acheter du cialis en ligne en france </a>
guest 14.04.2017 12:55 # −11
<a href=" http://achatcialis5mgenligne.com/ ">acheter cialis 5mg en ligne en france </a>
guest 14.04.2017 21:11 # −11
<a href=" http://tadalafil20mgpaschereninde.com/ ">tadalafil 20mg pas cher en inde </a>
guest 15.04.2017 03:01 # −11
<a href=" http://achetertadalafilsansordonnance.com/ ">peut on acheter du cialis sans ordonnance en france </a>
guest 15.04.2017 06:31 # −11
<a href=" http://achattadalafilenfranceenpharmacie.com/ ">achat cialis en ligne france </a>
guest 15.04.2017 06:33 # −11
<a href=" http://acheterprednisone20mgenligne.com/ ">acheter prednisone 20 mg en ligne </a>
guest 15.04.2017 06:38 # −11
<a href=" http://acheterpropeciasurinternet.com/ ">acheter propecia sur internet </a>
guest 15.04.2017 20:29 # −11
<a href=" http://achatamoxicillinebiogaran1g.com/ ">acheter amoxicilline 1g en ligne </a>
1024-- 30.03.2017 20:10 # 0
А если 10 лет назад кто-то скомпилирует указанный ниже класс, у нас при вызове A().method(Class2017()) будут проблемы?
Если будут, то это по сути та же ситуация, но только она допустима в C++, а значит спокойно можно было за счёт знания исходного кода в vtable нагенерить вореций для всех случаев.
Antervis 30.03.2017 11:24 # 0
Если выносить информацию о типах в рантайм можно вообще много какой метушни натворить. Вот только делать каждый инт наследником Object'а и инстанцировать его в хипе - не самый производительный сценарий, вы не находите?
п.с. именно поэтому студия аж 15 гигов весит (если уже не больше)
ASD_77 30.03.2017 10:54 # 0
Antervis 30.03.2017 10:59 # 0
inho 29.03.2017 18:46 # 0
huesto 30.03.2017 00:04 # 0
inhoguest 30.03.2017 19:13 # 0