Здравствуйте, criosray, Вы писали:
ГВ>>Сериализация почти всегда нужна в контексте решения задач наподобие построения протокола обмена данными и тут уже трудозатраты на дублирование названий членов структур уезжают в такой микроскопический масштаб, что о них и рассуждать не стоит. C>С мира по нитке..
И будет гора ниток.
Я знаю только две бесконечные вещи — Вселенную и человеческую глупость, и я не совсем уверен насчёт Вселенной. (c) А. Эйнштейн
P.S.: Винодельческие провинции — это есть рулез!
Здравствуйте, March_rabbit, Вы писали:
M_>Здравствуйте, Mamut, Вы писали:
M>>Объект с циклическими ссылками и членами — указателями на другие объекты. Плюс является наследником другого объекта так, чтобы не надо было явно указывать: M>>
Здравствуйте, Геннадий Васильев, Вы писали:
ГВ>>>Сериализация почти всегда нужна в контексте решения задач наподобие построения протокола обмена данными и тут уже трудозатраты на дублирование названий членов структур уезжают в такой микроскопический масштаб, что о них и рассуждать не стоит. C>>С мира по нитке..
ГВ>И будет гора ниток.
Здравствуйте, Геннадий Васильев, Вы писали:
C>>В статье почти все правда. Просто преподнесена она так, чтоб сильно задеть программистов С++ и местами немного искажена.
ГВ>Угу, искажена вплоть до своей противоположности.
Нет.
C>>А некоторые языки (а именно С++) не имеют таких базовых понятий как: свойства, атрибуты, события, делегаты, лямбда-выражения, замыкания, duck typing, интерфейсы, covariance и contravariance, и много другого.
ГВ>свойства — синтезируется;
Нет. ГВ>атрибуты (в смысле сопоставляемых метаданных) — синтезируется;
Нет. ГВ>события — синтезируется;
Нет. ГВ>делегаты — синтезируется;
Нет. ГВ>лямбда-выражения — есть в C++0x;
Не есть, а будет. В данном топике речь вроде как не о C++0x вовсе. ГВ>замыкания — есть в C++0x;
Не есть, а будет. В данном топике речь вроде как не о C++0x вовсе. ГВ>duck typing — статический (и это очень хорошо);
Может Вы для начала узнаете для себя что такое утятина? ГВ>интерфейсы — полностью выражается средствами pure virtual;
Костыль. ГВ>covariance/contravariance — где именно их нет (ковариантные возвращаемые значения есть)?
Нигде их нет.
MX>>>13) "средств получить информацию о типе-параметре в языке просто нет" . Язык С++ на столько крут, что "в языке" это и не нужно — можно написать библиотеку. boost::is_abstract, is_arithmetic, is_array, is_base_and_derived, is_base_of, is_class, is_complex, is_compound, is_const... C>>О, ужас. ГВ>А что не так?
А Вы сами не видете?
MX>>>После слов "Это конечно здорово, но вот как узнать является ли этот тип каким-либо из элементарных типов, указателем или ссылкой ? Является ли он const или нет ?" этого профана сил осиливать его поток у меня не осталось. C>>Он правду сказал, а Вы классически "съехали на оскорбления", не могучи аргументированно ответить.
ГВ>Глупость он сказал. Элементарных типов очень мало, указатели и ссылочные типы определяются на раз. И таких натяжек полна статья.
Нет.
MX> M>Объект с циклическими ссылками и членами — указателями на другие объекты.
MX> libs\serialization\test\test_cyclic_ptrs.cpp
MX> M>Плюс является наследником другого объекта так, чтобы не надо было явно указывать: MX> M>
Можно быо бы, в boost:serialize избавились бы
MX> Библиотека знает обо всех типах — могла бы сложить их в список типов, а при сериализации — найти все базы данного типа. Не думаю, что бывают случаи, когда (де)сериализовать наследника надо, на базу — нет. Хотя, с другой стороны, базЫ можно ситать такими же полямИ, и библиотека сама никак не может догадаться — сериализовать ли базу, или нет (если данная база не сериализуется, то понятно, что не надо, а если сериализуется?)
Здравствуйте, Геннадий Васильев, Вы писали:
ГВ>свойства — синтезируется; ГВ>атрибуты (в смысле сопоставляемых метаданных) — синтезируется; ГВ>события — синтезируется; ГВ>делегаты — синтезируется;
Это говорит только о том, что в языке их не хватает. ГВ>лямбда-выражения — есть в C++0x; ГВ>замыкания — есть в C++0x;
Ага... Не прошло и 0х лет, как... ГВ>duck typing — статический (и это очень хорошо);
Ну, нормально... Но не так строго, как в Виртовских языках... ГВ>интерфейсы — полностью выражается средствами pure virtual;
Нормально. Но почему-то в других языках сочли необходимым такую конструкцию явно определить ГВ>covariance/contravariance — где именно их нет (ковариантные возвращаемые значения есть)?
А ковариантные — это какие? MX>>>13) "средств получить информацию о типе-параметре в языке просто нет" . Язык С++ на столько крут, что "в языке" это и не нужно — можно написать библиотеку. boost::is_abstract, is_arithmetic, is_array, is_base_and_derived, is_base_of, is_class, is_complex, is_compound, is_const... C>>О, ужас. ГВ>А что не так?
Дык ПИСАТЬ НАДО... А в других языках писать НЕ НАДО...
А челу требуется задачу решать, а не писать библиотеку...
Хочешь быть счастливым — будь им!
Без булдырабыз!!!
Здравствуйте, criosray, Вы писали:
ГВ>>Угу, искажена вплоть до своей противоположности. C>Нет.
Да ну? А как же RTTI, за который автору почему-то всегда приходится платить? Определение типов данных — из той же оперы.
C>>>А некоторые языки (а именно С++) не имеют таких базовых понятий как: свойства, атрибуты, события, делегаты, лямбда-выражения, замыкания, duck typing, интерфейсы, covariance и contravariance, и много другого. ГВ>>свойства — синтезируется; C>Нет.
Поиск тебе в помощь.
ГВ>>атрибуты (в смысле сопоставляемых метаданных) — синтезируется; C>Нет.
Как так? Неужто нельзя приклеить к объекту никаких данных? Ни указателем, ни базовым классом?
ГВ>>события — синтезируется; C>Нет. ГВ>>делегаты — синтезируется; C>Нет.
больше шести лет.
ГВ>>лямбда-выражения — есть в C++0x; C>Не есть, а будет. В данном топике речь вроде как не о C++0x вовсе. ГВ>>замыкания — есть в C++0x; C>Не есть, а будет. В данном топике речь вроде как не о C++0x вовсе.
Уже есть. Что там когда было — не суть.
ГВ>>duck typing — статический (и это очень хорошо); C>Может Вы для начала узнаете для себя что такое утятина?
Раньше предлагали устрицы. Снижается классность, снижается.
ГВ>>интерфейсы — полностью выражается средствами pure virtual; C>Костыль.
Понятно. "Толстенькая — скоро лопнет с жиру." (c)
ГВ>>covariance/contravariance — где именно их нет (ковариантные возвращаемые значения есть)? C>Нигде их нет.
А в документации есть. Дока врёт?
C>>>О, ужас. ГВ>>А что не так? C>А Вы сами не видете?
А по сути?
Я знаю только две бесконечные вещи — Вселенную и человеческую глупость, и я не совсем уверен насчёт Вселенной. (c) А. Эйнштейн
P.S.: Винодельческие провинции — это есть рулез!
Здравствуйте, LaptevVV, Вы писали:
ГВ>>свойства — синтезируется; ГВ>>атрибуты (в смысле сопоставляемых метаданных) — синтезируется; ГВ>>события — синтезируется; ГВ>>делегаты — синтезируется; LVV>Это говорит только о том, что в языке их не хватает.
Ну вот, теперь твоя очередь. ИМХО, если фича синтезируется, то и рассуждать не о чем.
ГВ>>лямбда-выражения — есть в C++0x; ГВ>>замыкания — есть в C++0x; LVV>Ага... Не прошло и 0х лет, как...
Ну, тем не менее.
ГВ>>duck typing — статический (и это очень хорошо); LVV>Ну, нормально... Но не так строго, как в Виртовских языках...
Так и способ использования другой, AFAIK.
ГВ>>интерфейсы — полностью выражается средствами pure virtual; LVV>Нормально. Но почему-то в других языках сочли необходимым такую конструкцию явно определить
Видимо, из-за отсутствия множественного наследования.
ГВ>>covariance/contravariance — где именно их нет (ковариантные возвращаемые значения есть)? LVV>А ковариантные — это какие?
class A {
public:
virtual A *f(){ ... }
};
class B : public A {
public:
virtual B *f(){ ... }
};
MX>>>>13) "средств получить информацию о типе-параметре в языке просто нет" . Язык С++ на столько крут, что "в языке" это и не нужно — можно написать библиотеку. boost::is_abstract, is_arithmetic, is_array, is_base_and_derived, is_base_of, is_class, is_complex, is_compound, is_const... C>>>О, ужас. ГВ>>А что не так? LVV>Дык ПИСАТЬ НАДО... А в других языках писать НЕ НАДО... LVV>А челу требуется задачу решать, а не писать библиотеку...
Дык — не надо ж. Он там в качестве контраргумента всё время рассуждает о непонятности внутреннего устройства буста.
Я знаю только две бесконечные вещи — Вселенную и человеческую глупость, и я не совсем уверен насчёт Вселенной. (c) А. Эйнштейн
P.S.: Винодельческие провинции — это есть рулез!
Здравствуйте, dmitry_npi, Вы писали:
_>Да нет, я-то сам его люблю. Случайно наткнулся на статью здесь. _>Он не просто его, не любит, он его ненавидит. И других заразить пытается. _>Вот, думаю, тролль Отличная приманка для священной войны.
Это чё еще за фигня?
Однако в случае многонитевых приложений подобная политика запросто приводит к возникновению т.н. raise condition, например, одна нить может уничтожить одну переменную, а другая — что-то записать в нее.
Здравствуйте, Геннадий Васильев, Вы писали:
ГВ>>>Угу, искажена вплоть до своей противоположности. C>>Нет.
ГВ>Да ну? А как же RTTI, за который автору почему-то всегда приходится платить? Определение типов данных — из той же оперы.
Ну и где тут противоположность?
C>>>>А некоторые языки (а именно С++) не имеют таких базовых понятий как: свойства, атрибуты, события, делегаты, лямбда-выражения, замыкания, duck typing, интерфейсы, covariance и contravariance, и много другого. ГВ>>>свойства — синтезируется; C>>Нет.
ГВ>Поиск тебе в помощь.
Открываем стандарт С++, смотрим, не находим, извиняемся?
ГВ>>>атрибуты (в смысле сопоставляемых метаданных) — синтезируется; C>>Нет. ГВ>Как так? Неужто нельзя приклеить к объекту никаких данных? Ни указателем, ни базовым классом?
Это не атрибуты. Почитайте чтоли что такое атрибуты.
public class TraceAttribute : OnMethodBoundaryAspect
{
public override void OnEntry( MethodExecutionEventArgs eventArgs)
{
Trace.TraceInformation("Entering {0}.", eventArgs.Method);
Trace.Indent();
}
public override void OnExit( MethodExecutionEventArgs eventArgs)
{
Trace.Unindent();
Trace.TraceInformation("Leaving {0}.", eventArgs.Method);
}
}
Это костыли, пытающиеся их эмулировать. В языке их НЕТ.
ГВ>>>лямбда-выражения — есть в C++0x; C>>Не есть, а будет. В данном топике речь вроде как не о C++0x вовсе. ГВ>>>замыкания — есть в C++0x; C>>Не есть, а будет. В данном топике речь вроде как не о C++0x вовсе. ГВ>Уже есть. Что там когда было — не суть.
Не уже есть, а будет тогда, когда будет выпущен релиз компилятора языка С++0x.
И повторяю С++0x != C++, о котором речь.
ГВ>>>duck typing — статический (и это очень хорошо); C>>Может Вы для начала узнаете для себя что такое утятина? ГВ>Раньше предлагали устрицы. Снижается классность, снижается.
Ликбез: утятина не может быть статической. По определению. Не пишите больше таких глупостей, ок?
ГВ>>>covariance/contravariance — где именно их нет (ковариантные возвращаемые значения есть)? C>>Нигде их нет. ГВ>А в документации есть. Дока врёт?
Ссылку на соответствующий раздел документации в студию.
C>>>>О, ужас. ГВ>>>А что не так? C>>А Вы сами не видете? ГВ>А по сути?
А по сути — О, ужас. Других слов нет.
Здравствуйте, Геннадий Васильев, Вы писали:
LVV>>Это говорит только о том, что в языке их не хватает. ГВ>Ну вот, теперь твоя очередь. ИМХО, если фича синтезируется, то и рассуждать не о чем.
Не... Есть... Синтезируется — это не стандарт определения языка, а реализация конкретного разработчика интегрированной среды...
При переходе со среды на среду — придется разбираться, как там эти фичи синтезированы. ГВ>>>лямбда-выражения — есть в C++0x; ГВ>>>замыкания — есть в C++0x; LVV>>Ага... Не прошло и 0х лет, как... ГВ>Ну, тем не менее.
Ну так еще и нет жиж... ГВ>>>duck typing — статический (и это очень хорошо); LVV>>Ну, нормально... Но не так строго, как в Виртовских языках... ГВ>Так и способ использования другой, AFAIK.
Ну, в этом вопросе более-менее нормально. ГВ>>>интерфейсы — полностью выражается средствами pure virtual; LVV>>Нормально. Но почему-то в других языках сочли необходимым такую конструкцию явно определить ГВ>Видимо, из-за отсутствия множественного наследования.
Видимо, множественное наследование ликвидировали из-за наличия озвученных проблем. И сочли за благо ввести отдельную конструкцию. ГВ>>>covariance/contravariance — где именно их нет (ковариантные возвращаемые значения есть)? LVV>>А ковариантные — это какие? ГВ>
ГВ>class A {
ГВ> public:
ГВ> virtual A *f(){ ... }
ГВ>};
ГВ>class B : public A {
ГВ> public:
ГВ> virtual B *f(){ ... }
ГВ>};
ГВ>
А, ну да... Видимо противники имеют ввиду, что полноценный объект ковариантно возвратить нельзя.
ГВ>>>А что не так? LVV>>Дык ПИСАТЬ НАДО... А в других языках писать НЕ НАДО... LVV>>А челу требуется задачу решать, а не писать библиотеку... ГВ>Дык — не надо ж. Он там в качестве контраргумента всё время рассуждает о непонятности внутреннего устройства буста.
Для него — действительно жуть... Меня тоже только крайняя нужда заставит буст использовать...
Но вообще статья, конечно, оставляет впечатление, что писал достаточно опытный программер, которому ПРИШЛОСЬ перейти на С++ по необходимости.
А это — действительно УЖОСССССС!!!!!
Хочешь быть счастливым — будь им!
Без булдырабыз!!!
ГВ>>>>covariance/contravariance — где именно их нет (ковариантные возвращаемые значения есть)?
C>>>Нигде их нет.
ГВ>>А в документации есть. Дока врёт?
C>Ссылку на соответствующий раздел документации в студию.
Здравствуйте, criosray, Вы писали:
ГВ>>Да ну? А как же RTTI, за который автору почему-то всегда приходится платить? Определение типов данных — из той же оперы. C>Ну и где тут противоположность?
Дык, отключается же RTTI даже в одиозном MSVC6. Определить типы данных — опять таки можно.
ГВ>>Поиск тебе в помощь. C>Открываем стандарт С++, смотрим, не находим, извиняемся?
Нет, в смысле — в гугль. Слова C++ и property.
ГВ>>>>атрибуты (в смысле сопоставляемых метаданных) — синтезируется; C>>>Нет. ГВ>>Как так? Неужто нельзя приклеить к объекту никаких данных? Ни указателем, ни базовым классом? C>Это не атрибуты. Почитайте чтоли что такое атрибуты.
Нет, ну в смысле взаимодействия с компилятором — да, такого нет. А вообще сопоставить данные с классом совсем не сложно.
ГВ>>Этому топику
больше шести лет. C>Это костыли, пытающиеся их эмулировать. В языке их НЕТ.
О-о-о... Это повод для большого флейма — какими должны быть делегаты.
C>Не уже есть, а будет тогда, когда будет выпущен релиз компилятора языка С++0x. C>И повторяю С++0x != C++, о котором речь.
Я тебе скажу больше MSVC6 != MSVC2K5, MSVC2K5 != MSVC2K10 и т.п. Что теперь, ругаться на C++, оперируя глюками MSVC6? И кроме того, внимательно смотрим на дату сообщения.
ГВ>>>>duck typing — статический (и это очень хорошо); C>>>Может Вы для начала узнаете для себя что такое утятина? ГВ>>Раньше предлагали устрицы. Снижается классность, снижается. C>Ликбез: утятина не может быть статической. По определению. Не пишите больше таких глупостей, ок?
.
ГВ>>>>covariance/contravariance — где именно их нет (ковариантные возвращаемые значения есть)? C>>>Нигде их нет. ГВ>>А в документации есть. Дока врёт? C>Ссылку на соответствующий раздел документации в студию.
ISO/ANSI 14882:1998, Раздел 10.3.5.
ГВ>>А по сути? C>А по сути — О, ужас. Других слов нет.
Понятно. Нет, так нет.
Я знаю только две бесконечные вещи — Вселенную и человеческую глупость, и я не совсем уверен насчёт Вселенной. (c) А. Эйнштейн
P.S.: Винодельческие провинции — это есть рулез!
Здравствуйте, esil, Вы писали:
E>Здравствуйте, criosray, Вы писали:
E>
ГВ>>>>>covariance/contravariance — где именно их нет (ковариантные возвращаемые значения есть)?
C>>>>Нигде их нет.
ГВ>>>А в документации есть. Дока врёт?
C>>Ссылку на соответствующий раздел документации в студию.
E>ISO/IEC 14882, пункт 10.3.5
Нету contravariance. Нету.
The return type of an overriding function shall be either identical to the return type of the overridden func-
tion or covariant with the classes of the functions.
ГВ>>>Поиск тебе в помощь. C>>Открываем стандарт С++, смотрим, не находим, извиняемся?
ГВ>Нет, в смысле — в гугль. Слова C++ и property.
Еще раз для тех, кто читать не умеет: открываем стандарт С++, смотрим, не находим, извиняемся.
ГВ>>>>>атрибуты (в смысле сопоставляемых метаданных) — синтезируется; C>>>>Нет. ГВ>>>Как так? Неужто нельзя приклеить к объекту никаких данных? Ни указателем, ни базовым классом? C>>Это не атрибуты. Почитайте чтоли что такое атрибуты.
ГВ>Нет, ну в смысле взаимодействия с компилятором — да, такого нет. А вообще сопоставить данные с классом совсем не сложно.
Ну сопоставте, чтоб так же выразительно, несложно, и функционально, как в моем примере, который Вы явно проигнорировали.
ГВ>>>Этому топику
больше шести лет. C>>Это костыли, пытающиеся их эмулировать. В языке их НЕТ. ГВ>О-о-о... Это повод для большого флейма — какими должны быть делегаты.
Какого флейма? Они либо есть, либо их нет. В С++ их нет. О чем тут флеймить? Аналогично linq, lambda, events, attributes, properties, implicit typing, duck typing и многое другое.
C>>Не уже есть, а будет тогда, когда будет выпущен релиз компилятора языка С++0x. C>>И повторяю С++0x != C++, о котором речь. ГВ>Я тебе скажу больше MSVC6 != MSVC2K5, MSVC2K5 != MSVC2K10 и т.п. Что теперь, ругаться на C++, оперируя глюками MSVC6? И кроме того, внимательно смотрим на дату сообщения.
Замечательно. "Все смешалось в доме Облонских". Вы разницу между языком программирования и средой разработки не видите совсем?
ГВ>>>>>duck typing — статический (и это очень хорошо); C>>>>Может Вы для начала узнаете для себя что такое утятина? ГВ>>>Раньше предлагали устрицы. Снижается классность, снижается. C>>Ликбез: утятина не может быть статической. По определению. Не пишите больше таких глупостей, ок? ГВ>Что-то ничего не понимаю
.
Да я заметил, что Вы ничего не понимаете. Даже не пытаетесь. Пишете всякую, извините, билеберду. Хотя б в вики заглянули, чтоб хоть какое-то представление иметь...
ГВ>>>>>covariance/contravariance — где именно их нет (ковариантные возвращаемые значения есть)? C>>>>Нигде их нет. ГВ>>>А в документации есть. Дока врёт? C>>Ссылку на соответствующий раздел документации в студию.
ГВ>ISO/ANSI 14882:1998, Раздел 10.3.5.
Здравствуйте, criosray, Вы писали:
C>В статье почти все правда. Просто преподнесена она так, чтоб сильно задеть программистов С++ и местами немного искажена.
Почти всё? Примеры?
C>Отлично. Напишите универсальный сериализатор в XML/Json.
Жду списка недостатков следующих библиотек:
TinyJSON
jsoncpp
zoolib
Jaula
JOST
JSON Spirit
CAJUN
C>RTTI очень слабое подобие метаинформации в управляемых языках.
Я пишу веб-сервисы на С++, биндинг одному малоизвестному языку программирования, библиотеку seamless integration для написания хранимых процедур на С++ для MS-SQL и много ещё чего, но НИГДЕ мне не нужен был RTTI. А Вы для чего RTTI использовали?
MX>>2) "Много ли Вы знаете простых и удобных persistence-библиотек". Ды, уж знаем, несколько.
C>Простых? Удобных? C>"Огласите весь список пжалуста!"
"Всего даже я не знаю". Я пользовлся Boost.Serialization, SF из RCF и одной собственного изготовления.
А по поводу простоты, расскажите нам на пальцах — как в Яве не сериализовать какое-нубудь поле в сериализуемом классе? И ещё хотелось бы про версионизацию тоже узнать.
MX>>8) "А как же исключения (exceptions), а как же RTII ?. За них то я всегда плачу всегда !!!". Караул! Заявляю — RTII в С++ никогда не было, C>RTTI, а не RTII в С++ было, есть и будет.
У аффтара — RTII. Вообще, у него в тексте вагон опечаток. У него, наверное, ко всему такой подход.
MX>>и не предвидится следующие лет 10 точно. C>Какой кошмар...
Зато — правда.
MX>>9) "будет изменена лишь копия объекта, которая сразу же после этого будет разрушена. Здорово, а ?". А некоторые языки, например, не позвляют выразить тот факт, что переданный в метод объект не будет изменён методом, которые принимает этот объект в качестве параметра.
А на это есть что ответить?
C>А некоторые языки (а именно С++) не имеют таких базовых понятий как: свойства, атрибуты, события, делегаты, лямбда-выражения, замыкания, duck typing, интерфейсы, covariance и contravariance, и много другого.
Вы считает это _базовыми_ понятиями? Очень интересно. А Вы знаете, что даже цикл — не базовое понятие?
свойств в языке нет, но это не значит, что нельзя написать window.visible = true, чтобы лучше разглядеть окно.
атрибуты? простите, за безграмотность.
события, делегаты? они в каком-то есть языке? круто. а мы, опять-таки — библиотеками обходимся.
лямбда-выражения, замыкания? в старом стандерте-таки да — нет. Но это не мешает нам написать std::for_each(c.begin(), c.end(), std::cout << _1 * _1 << std::endl);
duck typing? покажите пример на Яве, скажу спасибо. А template в С++ — это не оно? Точно? А почему?
интерфейсы? тоже отсутствуют. Покажите пример кода на С++, который будет красивее, будь в нём интерфейсы.
covariance и contravariance?
This variance refers to the parameters and return types of an overridden method in a descendant class. C++ supports this for covariance of return types. Return types and out parameters may be covariant, input parameters may be contravariant, and in-out parameters must be invariant. C++ example: ...
и дальше
"Neither C#, the CLI nor Java support override variance. C++ supports return type override covariance, but not override contravariant input arguments. C++/CLI doesn't support override covariant return types for managed classes. It gives this error:
error C2392: 'Dog ^Dog::GetValue(void)' : covariant returns types are
not supported in managed types, otherwise 'Mammal ^Mammal::GetValue(void)' would be overridden
MX>>13) "средств получить информацию о типе-параметре в языке просто нет" . Язык С++ на столько крут, что "в языке" это и не нужно — можно написать библиотеку. boost::is_abstract, is_arithmetic, is_array, is_base_and_derived, is_base_of, is_class, is_complex, is_compound, is_const... C>О, ужас.
Подробности будут?
MX>>После слов "Это конечно здорово, но вот как узнать является ли этот тип каким-либо из элементарных типов, указателем или ссылкой ? Является ли он const или нет ?" этого профана сил осиливать его поток у меня не осталось. C>Он правду сказал, а Вы классически "съехали на оскорбления", не могучи аргументированно ответить.
Таки-да, отвечать на весь текст мне не захотелось. Если-б у него было достаточно ума, чтобы обсуждать дефекты стандарта С++ — другое дело. "аргументированно ответить", говорите? Среди моих ответов нет таких — "О, ужас.". А про "как узнать является ли этот тип каким-либо из элементарных типов, указателем или ссылкой ? Является ли он const или нет ?" я ответил выше.
Если не поможет, будем действовать током... 600 Вольт (C)