Boost.Variant の apply_visitor に2つ以上渡す

こんな使い方も出来たんですね、知りませんでした。

[ソース]

#include <boost/variant.hpp>
#include <boost/lexical_cast.hpp>
#include <string>

typedef boost::variant<int, float, std::string> object_type;

struct equal : boost::static_visitor<bool>{
    bool operator ()(float a, int b) const{
        return a == static_cast<float>(b);
    }
    bool operator ()(std::string const& a, std::string const& b) const{
        return a == b;
    }
    template<typename T>
    bool operator ()(std::string const& str, T const& a) const{
        return str == boost::lexical_cast<std::string>(a);
    }
    template<typename T, typename U>
    bool operator ()(T const& a, U const& b) const{
        return (*this)(b, a);
    }
    template<typename T>
    bool operator ()(T const& a, T const& b) const{
        return a == b;
    }
};

int
main(){
    object_type o1(10);
    object_type o2(10.0f);
    object_type o3("10");
    
    std::cout << boost::apply_visitor(equal(), o1, o2) << std::endl;
    std::cout << boost::apply_visitor(equal(), o3, o2) << std::endl;
    std::cout << boost::apply_visitor(equal(), o1, o3) << std::endl;

    return 0;
}

[出力]

1
1
1

Boost.Variant の全ての組み合わせを受け取るような operator()() を定義しておけばいいみたいです。
上記の場合は、template を使用して、重複している処理をごにょごにょしていますが…。

[boost]

  • ver 1.47.0