我有一个变量,不同的类型都实现了operator++。我想直接在变量变量上应用增量。有什么简单的方法吗?或者让我把它应用在每种类型的开关上?
带有stl迭代器的简单示例:
typedef boost::variant<
std::vector<double>::iterator,
std::vector<double>::reverse_iterator,
std::set<double>::iterator,
std::set<double>::reverse_iterator
> AnyIterator;
void incr(AnyIterator& ai)
{
++adi; // this doesn't compile: no match for operator++ blah blah blah
// Have I really to write this kind of ugly thing ?
if(ai.type() == typeid(std::vector<double>::iterator))
++boost::get<std::vector<double>::iterator>(ai);
else if(ai.type() == typeid(std::vector<double>::reverse_iterator))
++boost::get<std::vector<double>::reverse_iterator>(ai);
else if(ai.type() == typeid(std::set<double>::iterator))
++boost::get<std::set<double>::iterator>(ai);
else if(ai.type() == typeid(std::set<double>::reverse_iterator))
++boost::get<std::set<double>::reverse_iterator>(ai);
}注:我使用gcc 4.8.1和Boost 1.57。我不想要C++11的解决方案,我不能使用它,因为它与老gcc版本兼容。
发布于 2016-05-30 13:52:29
您可以定义一个泛型函子,然后在该函子中使用boost::apply_visitor:
namespace detail {
struct incrementer {
template< typename T >
void operator()(T& x) const { ++x; }
typedef void result_type;
};
}
void incr(AnyIterator& ai)
{
boost::apply_visitor(detail::incrementer(),ai);
}https://stackoverflow.com/questions/37527086
复制相似问题