Обязательная специализация классов
От: Аноним  
Дата: 20.08.09 18:42
Оценка:
Добрый вечер. Хочу унифицировать работу с данными разных типов. Для этого вокруг данных строится класс, который дополняет данные свойствами. Для работы с данными предусмотрены методы чтения/записи. Для каждого типа данных должна быть своя специализация. При этом, если объявляется экземпляр с типом данных, для которого нет специализации, то должна быть ошибка во время компиляции. Вот как это реализовано:
struct CValueBase
{
    enum STATUS { INITED, UNKNOWN };
    STATUS Status;
    CValueBase() { Status = UNKNOWN; }
    bool IsInited()   { return Status==INITED; }
    STDMETHOD(Write)(VARIANT Val) PURE;
    STDMETHOD(Read)(VARIANT *pVal) PURE;
};

template<typename T>
struct CValue : public CValueBase
{
    T Value;
    STDMETHOD(Read)(VARIANT *pVal)
    {
        if ( Status==UNKNOWN ) return E_FAIL;
        return CComVariant(Value).Detach(pVal);
    }
    STDMETHOD(Write)(VARIANT Val) PURE;    // [1]
};

template<> STDMETHOD(CValue<bool>::Write)(VARIANT Val)
{
    Value = Val.boolVal==VARIANT_TRUE;
    return S_OK;
}

CValue<bool> test;

Если отсутствует строка, отмеченная коментарием [1], то компилятор ругается (error C2244: 'CValueBase::Write' : unable to match function definition to an existing declaration). Если строка есть, то при определении экземпляра test не используется специализация и компилятор снова ругается (error C2259: 'CValue<T>' : cannot instantiate abstract class). Что-то не пойму, что тут нетак
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.