Хай!
Как обьявить общую коллекцию шаблонных свойств?
Например:
template<class Type, class BaseType, class OwnerType>
class TProperty
{
public:
typedef bool (OwnerType::*SetProperty)(const Type& x_value);
typedef Type (OwnerType::*GetProperty)() const;
private:
Type value;
BaseType* owner;
SetProperty setter;
GetProperty getter;
//...
};
Тогда в своем классе:
class MyObject : public BaseObject
{
private:
TProperty<long, BaseObject, MyObject> left;
TProperty<bool, BaseObject, MyObject> enabled;
TProperty<string, BaseObject, MyObject> caption;
private:
map<string, TProperty*> properties; //Ecли так обьявляю то компилер VS2005 падает fatal error C1001: An internal error has occurred in the compiler.
};
Как правильно залить в коллекцию все разнородные свойства? Неужели только через void*?
Спасибо!
А>Хай!
А>Как обьявить общую коллекцию шаблонных свойств?
Для этого надо наследоваться от общей базы:
class PropertyBase
{
public:
virtual ~PropertyBase() {}
...
};
template<class Type, class BaseType, class OwnerType>
class TProperty : public PropertyBase
{
...
};
ну и далее
class MyObject : public BaseObject
{
...
private:
map<string, PropertyBase*> properties;
};
Здравствуйте, Анатолий Широков, Вы писали:
АШ>Для этого надо наследоваться от общей базы:
А смысл? Как же тогда вызывать шаблонные функции через базу?
Здравствуйте, Аноним, Вы писали:
А>Здравствуйте, Анатолий Широков, Вы писали:
АШ>>Для этого надо наследоваться от общей базы:
А>А смысл? Как же тогда вызывать шаблонные функции через базу?
Для этого Вам надо продумать интерфейс PropertyBase, который и позволит объединить "необъединяемое".
Здравствуйте, Аноним, Вы писали:
А>Здравствуйте, Анатолий Широков, Вы писали:
АШ>>Для этого надо наследоваться от общей базы:
А>А смысл? Как же тогда вызывать шаблонные функции через базу?
через базу надо вызывать виртуальные функции, а шаблонами их нужно реализовывать.
Здравствуйте, Анатолий Широков, Вы писали:
АШ>Для этого Вам надо продумать интерфейс PropertyBase, который и позволит объединить "необъединяемое".
Я вспомнил про VARIANT, можна через него TYPE->VARIANT->STRING и наоборот STRING->VARIANT->TYPE, то есть обьединяющие функции будут не шаблонные, а string-овые. Все разобрался. Спасибо