我正在尝试在这种情况下获取模板参数类型:
#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/