所以我有一个继承自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
进入父类。
答案 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::begin
和std::end
,也可以为您的容器找到这些功能。你需要这样的东西才能真正涵盖在这里。
这又说了一句话:为什么?