提问人:Gamaray 提问时间:4/15/2023 更新时间:4/15/2023 访问量:314
C++ 将 std::any 转换为基类,而不知道派生类类型
C++ cast std::any to base class without knowing derived class type
问:
这里有一个有点晦涩的问题,但我需要一种方法来转换为它的基类,而不知道它是什么派生类。std::any
换句话说,给定一个基类:
struct HCallable {
int numArgs;
std::vector<std::type_info> argTypes;
virtual std::any call(std::vector<std::any> args)=0;
};
以及其(众多)派生类之一的实例:
class in : public HCallable {
public:
int numArgs=1;
std::any call(std::vector<std::any> args) {
std::cout << huff::anyToString(args[0]);
std::string result;
std::getline(std::cin, result);
return result;
}
};
std::any instance = std::any(new in());
我怎样才能接受这个实例,并在不知道有类型的情况下将其转换为类型的对象。HCallable
instance
in
如果只有我能找到一种不明确声明的方法,此代码就可以工作:in*
HCallable* func = dynamic_cast<HCallable*>(std::any_cast<in*>(instance));
答:
-2赞
Deepak Kumar
4/15/2023
#1
下面介绍如何使用 和 将未知派生类的对象转换为其基类类型std::any_cast
dynamic_cast.
首先,您需要从 std::any 中提取指向派生类对象的存储指针。为此,可以使用指向基类的指针,然后可以使用 dynamic_cast安全地将指针转换为基类指针类型。std::any_cast
HCallable
HCallable*
下面是您可以执行以下操作的示例:
std::any instance = std::make_any<DerivedClass>();
// Extract derived class object from std::any
auto derivedPtr = std::any_cast<DerivedClass*>(&instance);
// convert the pointer to the base class
HCallable* basePtr = dynamic_cast<HCallable*>(*derivedPtr);
// Check if pointer conversion completed before using basePtr
if (basePtr) {
// Here you can use basePtr as an HCallable*
} else {
// error
}
评论
0赞
chrysante
4/15/2023
这正是OP想要避免的。他们想在不知道派生的类型的情况下强制转换为基数。
评论
HCallable
std::unique_ptr<HCallable> instance = std::make_unique<in>();
call
std::any
std::any
std::any
HCallable
std::any
std::unique_ptr<HCallable>
std::function
std::any
std::type_info
HCallable