增加 boost::variant 值
Increment boost::variant value
我有一个变体变量,其中不同类型都实现了 operator++
。我想直接在 variant 变量上应用增量。有没有简单的方法可以做到这一点?或者我必须在每种类型的开关中应用它吗?
带有 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 版本的兼容性,我无法使用它。
您可以定义一个通用仿函数,然后将 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);
}
我有一个变体变量,其中不同类型都实现了 operator++
。我想直接在 variant 变量上应用增量。有没有简单的方法可以做到这一点?或者我必须在每种类型的开关中应用它吗?
带有 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 版本的兼容性,我无法使用它。
您可以定义一个通用仿函数,然后将 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);
}