Как я могу получить тип переменной и сохранить ее в шаблоне функции / класса - PullRequest
0 голосов
/ 14 апреля 2020

Я пытаюсь сохранить имя переменной и использовать его для шаблонного класса. Но это также должно быть очень гибким с каждым классом / типом: что угодно (для Alocater), и я еще ничего не нашел по этому поводу.

Вот пример кода одной из моих попыток:

#include<iostream>

template<typename T>
struct a{
    T*Data;

    a(T*Data):Data(Data){}
}

int main(){
    int i = 10;
    a<int>* obj1 =new a<int>(&a);

    //Later

    std::string Dat_Type= typeid(*obj1->Data).name();
    a<Dat_Type> obj2;//This Doesnt work 
}

1 Ответ

2 голосов
/ 14 апреля 2020

Строка, содержащая имя типа, не совпадает с типом. Первый существует только во время выполнения, а последний существует только во время компиляции.

Что вы можете сделать, это добавить псевдоним типа к a, который можно передать в другой шаблон:

template <typename T>
struct a {
    using value_type = T;
    //...
};

int main() {
    a<int> obj1;

    // Later

    a<decltype(obj1)::value_type> obj2;
}

Live Demo

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

template <typename T>
struct a_traits {};

template <typename T>
struct a_traits<a<T>> {
    using value_type = T;
};

int main() {
    a<int> obj1;

    // Later

    a<a_traits<decltype(obj1)>::value_type> obj2;
}

Live Demo


Конечно, если вы объявляете второй объект точно такого же типа, вам не нужно делать ни одну из этих вещей. Вы можете просто использовать decltype:

int main() {
    a<int> obj1;

    // Later

    decltype(obj1) obj2;
}

Live Demo

...