LINUX.ORG.RU

Плюсы , реализация класса .


0

0

Имеем enum DataType{ TYPE1,TYPE2,...TYPEN };
каждая константа соответсвует определённому POD типу (uchar , int , double ...)

template<typename T>
struct property {
std::string name;
T value;
};

но чтобы эта структура зависела от DataType , которая дефинирована
в сишной библиотеке , куда мне доступа нет .
Например TYPE1 соответствует unsigned char - значит мне нужна структура
с T=unsigned char .
Как реализовать такое ?

★★★

> Как реализовать такое ?

шаблон с параметром DataType и частичная специализация для каждого члена енума?

dilmah ★★★★★
()

Первое что приходит в голову - вектор типов с нужными типами по соответствующим индексам.

Sectoid ★★★★★
()
Ответ на: комментарий от dilmah

>шаблон с параметром DataType и частичная специализация для каждого члена енума?

Тоже дело, но геморойно, ибо в этом случае придётся писать однообразный код...

Sectoid ★★★★★
()

Я в плюсах не особо шарю, но вроде лучше зафигачить "метафункцию",
возвращающую тип по значению enum, и заюзать её в определении
struct Propery.

#include <string>

enum DataType { DT_CHAR, DT_INT, DT_DOUBLE };

template <enum DataType> struct Enum2Type {};
template <> struct Enum2Type<DT_CHAR>   { typedef char   T; };
template <> struct Enum2Type<DT_INT>    { typedef int    T; };
template <> struct Enum2Type<DT_DOUBLE> { typedef double T; };

template <enum DataType T>
struct Property {
    std::string name;
    typename Enum2Type<T>::T value;
};

int main(void) {
    Property<DT_CHAR>   p1;
    Property<DT_INT>    p2;
    Property<DT_DOUBLE> p3;
    p1.value = 'c';
    p2.value = 32768;
    p3.value = 1.0;
    return 0;
};

tche
()
Ответ на: комментарий от Sectoid

> Первое что приходит в голову - вектор типов с нужными типами по соответствующим индексам.

не догоняю, а как можно хранить типы в векторе? В С++ вроде типы не являются first class entities:)

dilmah ★★★★★
()
Ответ на: комментарий от tche

Добавлю: если значений в enum много, удобней макросами:

#define DEF_MAPPING(e, t) template <> struct Enum2Type<e> { typedef t  T; };
DEF_MAPPING(DT_CHAR,   char);
DEF_MAPPING(DT_INT,    int);
DEF_MAPPING(DT_DOUBLE, double);

tche
()
Ответ на: комментарий от Sectoid

для етого придумали препроцессоры макропроцессоры и генераторы кода

cvv ★★★★★
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.