std::string className; std::make_shared<className>() className的值作为类名,应该怎么实现
时间: 2024-09-24 20:26:59 浏览: 37
在C++中,直接用`std::string className`存储类名并用`std::make_shared<className>()`来创建该类的新实例通常不是直接可行的,因为`std::make_shared`需要显式指定具体的类类型(如`std::make_shared<MyClass>()`),而不是通过字符串动态查找。
然而,如果你有一个预先存储了类名的列表(比如在一个字符串数组或map中),并且你想动态地根据这些名称创建类的实例,你需要借助反射机制,这在C++标准库中并没有提供直接的支持。可以考虑使用第三方库如Boost.Python或者第三方工具来间接实现。
一个简化版本的示例(假设我们有一个全局映射来存储这些信息):
```cpp
#include <unordered_map>
#include <typeinfo>
// 假设有一个映射存储了类名和对应的构造函数字符串
std::unordered_map<std::string, std::string> classMap = {{"MyClass", "std::make_shared<MyClass>()"}};
// 获取类名
std::string className = "MyClass";
// 验证映射中是否存在这个类名
if (classMap.find(className) != classMap.end()) {
// 使用eval函数尝试解析字符串为一个表达式,然后执行
auto factoryExpression = classMap[className];
auto sharedObject = evalAndCreateSharedObject(factoryExpression); // 这里需要自定义eval函数
}
void evalAndCreateSharedObject(const std::string &expression) {
// 这部分通常涉及更复杂的解析和执行过程,这里只是示意
try {
auto factory = eval(expression);
return factory(); // 假设工厂函数返回std::shared_ptr
} catch(...) {
throw std::runtime_error("Failed to create object from expression");
}
}
```
注意:实际使用时,这种做法可能存在安全风险,因为它涉及到字符串到C++代码的转换,如果恶意用户能够控制这些字符串,可能会引发严重的问题。因此,反射和代码执行应在严格的限制和安全措施下进行。
阅读全文