如何循环继承自boost :: any中包含的std :: vector的类

时间:2013-07-10 14:19:22

标签: c++ c++11

所以我有一个继承自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进入父类。

1 个答案:

答案 0 :(得分:2)

假设此假设容器支持begin / end

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

抛出像你一样的事情是对通用编程如何运作的可怕误解。

如果您想拥有这样不同容器的容器,使用新的Boost.TypeErasure any可能会对您有所帮助。我想你需要谓词,如

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

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

这又说了一句话:为什么?