gpt4 book ai didi

c++ - 有没有办法在不知道派生类型的情况下将包含派生指针的 std::any 强制转换为基指针?

转载 作者:行者123 更新时间:2023-12-04 08:46:49 31 4
gpt4 key购买 nike

假设我有一个 std::any对象可能包含也可能不包含指向给定基类的某个派生类的指针 B .有什么办法可以做到:

  • 返回 B * ,如果 std::any对象包含可转换为 B * 的东西, 或
  • 如果没有则抛出异常?

  • 好像 dynamic_caststd::any_cast每个都提供此功能的一半,但我看不出有任何方法可以将两者放在一起。

    我知道我可以通过各种方式完成这项工作,包括明确枚举可转换为 B * 的每种类型。 ,但这是所有 DRY 违规的根源。

    示例用例:
    std::vector<std::any> setupTools(const std::string & confFile)
    {
    std::vector<std::any> myTools;

    auto conf = parse(confFile);

    for(std::string & wrenchInfo : conf["Wrenches"])
    {
    Wrench::setup(myTools, wrenchInfo);
    }

    for(std::string & hammerInfo : conf["Hammers"])
    {
    Hammer::setup(myTools, hammerInfo);
    }

    // 25 more kinds of tools
    }

    Factory1::init(const std::vector<std::any> & tools)
    {
    m_wrench = any_get<Wrench *>(tools);
    m_hammer = any_get<Hammer *>(tools);
    m_saw = any_get<Saw *>(tools);
    }

    Factory2::init(const std::vector<std::any> & tools)
    {
    m_wrench = any_get<TorqueWrench *>(tools);
    }

    Factory3::init(const std::vector<std::any> & tools)
    {
    m_saw = any_get<CordlessReciprocatingSaw *>(tools);
    }

    我不想包含一堆样板代码,列出现有的每一种锯,只是为了我可以捕获锯——任何 Saw -- 用于 Factory1 .

    最佳答案

    这是无法实现的。只能从 std::any 中取出对象完全使用放入其中的类型。因此,您必须知道类型才能从中获取任何信息。

    看来std::any不适合您的用例。

    关于c++ - 有没有办法在不知道派生类型的情况下将包含派生指针的 std::any 强制转换为基指针?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58718012/

    31 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com