我正在尝试在这种情况下获取模板参数类型:

#include <iostream>
#include <string>
#include <map>
#include <typeinfo>

class Base {
public:
    typedef char myType;
};

template <typename T>
class Derived : public Base {
public:
    typedef T myType;
};

int main() {
    std::map<std::string, Base*> myMap;
    myMap["test1"] = new Derived<int>();
    myMap["test2"] = new Derived<float>();

    std::cout << typeid(myMap["test1"]).name() << std::endl; // prints Base
    std::cout << typeid(myMap["test2"]).name() << std::endl; // prints Base

    //myMap["test1"]->myType test; // invalid use of 'Base::myType'

    std::cout << typeid(dynamic_cast<Derived*>(myMap["test1"])->myType).name() << std::endl; // invalid use of template-name 'Derived' without an argument list. Should print "int" ...
    std::cout << typeid(dynamic_cast<Derived*>(myMap["test2"])->myType).name() << std::endl; // invalid use of template-name 'Derived' without an argument list. Should print "float" ...
}


该映射包含类型为Base的元素,因此还包含使用模板参数派生的类型的元素。但是,从地图上检索元素时,我无法再次获取模板参数类型。我试图将typedef添加到两个类中,但是它不起作用。

您是否有解决此问题的提示?

提前致谢!

最佳答案

您是否有解决此问题的提示?


类型名称不能像virtual成员函数那样工作。您需要的是virtual成员函数。

这是一个演示程序:

#include <iostream>
#include <string>
#include <map>
#include <typeinfo>

class Base {
public:
    virtual std::type_info const& myType() const { return typeid(char); }
};

template <typename T>
class Derived : public Base {
public:
    virtual std::type_info const& myType() const { return typeid(T); }
};

int main() {
    std::map<std::string, Base*> myMap;
    myMap["test1"] = new Derived<int>();
    myMap["test2"] = new Derived<float>();

    std::cout << myMap["test1"]->myType().name() << std::endl;
    std::cout << myMap["test2"]->myType().name() << std::endl;
}


用g ++输出:

i
f

关于c++ - 在 map 中获取不了解模板参数的派生类的模板参数类型,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/51755340/

10-12 06:58