boost :: any_cast - выбрасывать только когда неявное преобразование недоступно - PullRequest
4 голосов
/ 26 ноября 2008

Я хочу, чтобы boost::any_cast<T> генерировал исключение только тогда, когда тип any не имеет неявного преобразования в T. Кажется, что нормальным поведением является исключение, если тип any не T, независимо от неявных преобразований.

Пример:

boost::any a = 1;
boost::any_cast<int>(a); // This succeeds, and rightfully so
boost::any_cast<long>(a); // I don't want this to throw
boost::any_cast<Widget>(a); // I want this to throw

Может ли кто-нибудь сказать мне, есть ли простой способ получить желаемую функциональность, или, что еще лучше, дать мне вескую причину, почему существующее поведение таково, как оно есть?

Ответы [ 2 ]

5 голосов
/ 26 ноября 2008

Ну, вы не можете это сделать. Механизм any работает следующим образом:

struct base {
    virtual ~base() { }
};

template<typename T>
struct concrete_base : base {
    T t;
    concrete_base(T t):t(t) { }
};

struct my_any {
    base * b;

    template<typename T>
    my_any(T t):b(new concrete_base<T>(t)) { }

    template<typename T>
    T any_cast() { 
        concrete_base<T> * t = dynamic_cast< concrete_base<T>* >(b);
        if(!t) throw bad_any_cast();
        return t->t;
    }
};

Надеюсь, понятно, что делает вышеперечисленное. Думаю, вы никак не сможете сделать то, что ищете. Причина в том, что нет информации о сохраняемом типе, которая могла бы оказаться здесь полезной. RTTI не предоставляет его.

0 голосов
/ 06 июня 2015

any_cast не может этого сделать, но если базовый и производные типы завершены (что обычно для типов, находящихся в иерархии), вы можете реализовать свою собственную систему, которая конвертирует с помощью throw и catch, так как бросает указатель к производному типу можно отловить как базовый тип указателя.

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