增量提升::变量值(Increment boost::variant value)

我有一个变量变量,其中不同的类型都实现了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版本的兼容性,我无法使用它。

I have a variant variable where the different types all implement operator++. I would like to apply incrementation directly on the variant variable. Is there an easy way to do that ? Or have I to apply it in a switch on each type ?

Simple example with stl iterators :

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); }

Note : I use gcc 4.8.1 and Boost 1.57. I don't want solution from C++11, I can't use it due to compatibility with old gcc versions.

最满意答案

您可以定义一个通用仿函数,然后将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); }

You can define a generic functor and then use boost::apply_visitor with that functor:

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); }

更多推荐