Тип класса из указателя используется в качестве аргумента шаблона - PullRequest
3 голосов
/ 13 июля 2010

Если указатель на определенный пользователем тип передается в качестве аргумента шаблона в класс шаблона, возможно ли получить тип класса аргумента?

template <class T> struct UserType {
    typedef T value_type;
    ...
};

int main () {
    typedef std::vector<UserType<double>*> vecType
    vecType vec;

    vecType::value_type::value_type m; //how to get the double here?

    return 0;
}

Ответы [ 4 ]

5 голосов
/ 13 июля 2010

Использовать boost :: remove_pointer .

5 голосов
/ 13 июля 2010

Использовать черты:

template <typename> struct ptr_traits {};
template <typename T> struct ptr_traits<T*>
{ typedef T value_type; };

ptr_traits<vecType::value_type>::value_type m;
2 голосов
/ 13 июля 2010

Черты, вероятно, способ пойти сюда.

В качестве альтернативы, вы можете ввести еще typedef и использовать это в объявлении vecType и m:

typedef UserType<double>* UserTypeDoublePtr;
typedef std::vector<UserTypeDoublePtr> vecType;

UserTypeDoublePtr m;
0 голосов
/ 13 июля 2010

Позвольте мне спросить вас, что вы подразумеваете под "получением" типа?

На самом деле вы можете использовать этот тип, например, вы можете объявить новые переменные этого типа (как вы продемонстрировали в своем примере), без явного указания этого.

Вы хотите сказать, что хотите текстовое описание типа?

Если это так, то нет никакого общего 100% работающего способа сделать это. Это потому, что после компиляции + тип ссылки и имена переменных / функций исчезают. Они просто не существуют во время выполнения.

Однако вы можете написать дополнительный код, чтобы получить текстовое описание нужных вам типов. Один из способов сделать это:

template <typename T> const char* TypeName();
template <> const char* TypeName<int>() { return "int"; }
template <> const char* TypeName<double>() { return "double"; }
// ...

Вы получите ошибку компоновщика, если попытаетесь использовать TypeName для типа, имя которого вы еще не определили. Затем вам нужно будет добавить соответствующий шаблон специализации TypeName.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...