std::any_cast不需要原始对象的类型
std::any_cast without needing the type of the original object
是否可以在不输入第一个模板参数(any
覆盖的对象类型)的情况下使用 std::any_cast
?我尝试使用 any_cast<decltype(typeid(toCast).name())>
但它没有用。
也尝试从一开始就存储对象类型,但这也没有用,因为变量不能存储类型。
C++ 的基本原则之一是所有对象的类型在编译时都是已知的。这是绝对规则,没有例外。
相关对象的类型是std::any
。只有在编译时也知道该类型时,它才可以转换为其他类型。
您会注意到 std::type_info::name()
不是 constexpr
表达式。返回的字符串仅在 运行 时间已知。您正在尝试将某些内容转换为一个对象,该对象的类型只能在 运行 时间知道。 C++ 不能这样工作。
一般来说,每当发生这种情况时,几乎所有正确的解决方案都会涉及在基 class 上调用虚拟方法。您可能需要重新设计 classes 以使用继承和虚拟方法;使用他们的共同基础 class 而不是 std::any
;然后调用它的虚拟方法。在某些情况下 std::variant
也可能有效。
是否可以在不输入第一个模板参数(any
覆盖的对象类型)的情况下使用 std::any_cast
?我尝试使用 any_cast<decltype(typeid(toCast).name())>
但它没有用。
也尝试从一开始就存储对象类型,但这也没有用,因为变量不能存储类型。
C++ 的基本原则之一是所有对象的类型在编译时都是已知的。这是绝对规则,没有例外。
相关对象的类型是std::any
。只有在编译时也知道该类型时,它才可以转换为其他类型。
您会注意到 std::type_info::name()
不是 constexpr
表达式。返回的字符串仅在 运行 时间已知。您正在尝试将某些内容转换为一个对象,该对象的类型只能在 运行 时间知道。 C++ 不能这样工作。
一般来说,每当发生这种情况时,几乎所有正确的解决方案都会涉及在基 class 上调用虚拟方法。您可能需要重新设计 classes 以使用继承和虚拟方法;使用他们的共同基础 class 而不是 std::any
;然后调用它的虚拟方法。在某些情况下 std::variant
也可能有效。