Здравствуйте alex_shar, Вы писали:
AS>НУЖНО реализовать ассоциотивный контейнер, такой, что он может хранить обьекты любых типов, но возвращать значение можно только зная его тип. Только по id, не зная типа получить его невозможно.
Во-первых, зачем именно такая постановка задачи?
Во-вторых, данные каких типов предполагается хранить (все — это слишком общо)
числа
указатели на числа
указатели на структуры, массивы (сюда же можно отнести С-строки)
указатели на объекты
указатели на ком-объекты
варианты
и так далее.
Для каждого случая есть свой механизм распознавания типа.
Наиболее общий, хотя и геморройный способ — хранить варианты (VARIANT) и на попытку чтения проверять соответствие типа. Способ не пригоден для не-комовских объектов.
В-третьих, как предполагается оформлять отказ?
подсовывать значение по умолчанию
возвращать код ошибки
бросать исключение
В-четвертых, возможно ли, чтобы одному ключу соответствовал "букет" (несколько значений разных типов), или же один ключ — одно данное? Что происходит при повторной записи по одному ключу значения другого типа?
В-пятых, какая конверсия типов возможна?
все типы различны (int != long)
целые типы с точностью до размера и знака (int == long != unsigned != short != char)
целые типы эквивалентны, вещественные эквивалентны
(для классов) записанный объект субкласса (наследник) эквивалентен запрашиваему суперклассу (предку)
(для ком-объектов) запрашивается интерфейс; если объект его имеет — удача
(для диспинтерфейсов) запрашивается свойство или метод
В-шестых, можно ли для объектов безымянного типа (тип не идентифицируется средствами RTTI языка, например, перечисление, массив или структура) указывать тип "вручную"
setValue("key", "MyStructure", new MyStruc);
getValue("key", "MyStructure", (void**)&pMyStruc) --> true
getValue("key", "SomethingElse", (void**)&pXXX) --> false
(в принципе, так работает COM)
Наконец, какой инструментарий предполагается использовать?
голый С
STL
MFC
COM
Если вы делаете библиотеку, то какой инструментарий наиболее подходит для стыковки с другими модулями?