Можно ли использовать boost.any в качестве ключа в std :: map (или что-то похожее)? - PullRequest
2 голосов
/ 05 мая 2009

std::map<any, string> не работает, поэтому мне интересно, есть ли другой подход к у вас есть произвольные ключи?

Ответы [ 3 ]

5 голосов
/ 05 мая 2009

Я думаю, что проблема не в Boost::Any, а в том, что вы не указываете пользовательский компаратор. Поскольку map является отсортированным ассоциативным контейнером, вам необходим компаратор.

У меня работает следующее: адаптировать его в соответствии с вашими целями:

#include <iostream>
#include <map>
#include <boost/any.hpp>

using namespace std;    
struct cmp {
    bool operator()(const boost::any& l, const boost::any& r) {
        try
        {
            int left = boost::any_cast<int>(l);
            int right = boost::any_cast<int>(r);
            return left < right;
        }
        catch(const boost::bad_any_cast &)
        {
            return false;
        }

        return false;
    }
};
int main() {   
    map<boost::any, string, cmp> ma;
     boost::any to_append = 42;
     ma.insert(std::make_pair(to_append, "int"));
    if (ma.find(42) != ma.end()) {
        cout << "hurray!\n";
    }
    return 0;
}
1 голос
/ 05 мая 2009

Возможно, вы захотите взглянуть на boost::variant, а не boost::any, поэтому вы можете быть уверены, что все используемые вами типы сопоставимы.

Использование посетителей было бы лучшим способом предоставления оператора сравнения для variant с.

0 голосов
/ 24 ноября 2018

Используйте if (any.type () == other.type ())

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...