有什么方法可以在不知道派生类型的情况下,将包含派生指针的std :: any转换为基本指针?

时间:2019-11-05 19:15:17

标签: c++ stdany

假设我有一个std::any对象,该对象可能包含也可能不包含指向给定基类B的某些派生类的指针。有什么办法可以做我的事情吗?

  1. 如果B *对象包含可转换为std::any的对象,则返回B *,或者
  2. 是否引发异常?

似乎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

3 个答案:

答案 0 :(得分:2)

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

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

答案 1 :(得分:0)

添加具有枚举ToolType属性的基类“工具”可以帮助您。然后使用ToolType可以决定演员表。

答案 2 :(得分:0)

我参加聚会很晚,只是碰到了这个问题,自己寻找答案。

这就是我最终解决的问题。

我需要将wxMenuItem *或某种控件的指针(都从wxControl派生)传递给std::any中的函数。我知道我是否有wxMenuItem *或基于标志的控件。因此,暂时忽略wxMenuItem *。

由于我的代码只需要与wxControl的基类一起工作(并且我想既然您的锤子共享一个公共基类,那么您只想做基锤类型的东西),我...

static_cast<wxControl*>(myCombo*)

在呼叫点

,然后

auto myPtr {std::any_cast<wxControl*>(theAnyField)};

在呼叫点,瞧。