0

所以我有一个继承自的基类std::vector

template<typename T>
class Base : public std::vector<T>
{
  std::vector<T> vect_;
public:
  Base() : std::vector<T>({1, 2, 3, 4, 5}){}

  const std::vector<T>  getContainer() const { return vect_;}
};

我已经将多个对象存储在一个容器中boost::any

当我经历时,我想遍历继承自std::vector.

我做了以下事情(有效)

  Base<int>     a;
  boost::any c = static_cast<decltype(a.getContainer())>(a);
  try
  {
    for (auto elem : boost::any_cast<std::vector<int>>(c))
      std::cout << elem << std::endl;
  }
  catch (boost::bad_any_cast)
  {}

我想知道是否还有其他方法可以做这种事情,因为您似乎无法boost::any_cast进入父类。

4

1 回答 1

2

假设这个假设的容器支持begin/ end

template<typename TContainer>
void do_foo(TContainer const& c) {
    for (auto const& i : c)
        foo(i); 
}

像你正在做的任何事情都是对泛型编程如何工作的严重误解。

如果您想要一个包含此类不同容器的容器,使用 newBoost.TypeErasure any可能会对您有所帮助。我认为您将需要谓词,例如

BOOST_TYPE_ERASURE_MEMBER((has_begin), begin, 0)
BOOST_TYPE_ERASURE_MEMBER((has_end), end, 0)

然而,这种方法(充其量)是不完整的。根据@R.Martinho Fernandes 的建议,这种类型不允许您获取可以在 range 中使用的所有内容for。所有std容器都可以使用std::beginstd::end,通过 ADL 找到,这些函数也可以在您的容器中找到。你需要这样的东西才能在这里真正涵盖。

这又说明了一点:为什么?

于 2013-07-10T14:25:16.233 回答