typeid или std::is_same для any? кто быстрее

270
20 февраля 2017, 17:29
class any
{
public:
    template<typename T>
    any(const T& t) : held_(new holder<T>(t)){}
    ~any(){ delete held_; }
    template<typename U>
    U cast() const
    {
        if(typeid(U) != held_->type_info())
            throw std::runtime_error("Bad any cast");
        return static_cast<holder<U>* >(held_)->t_;
    }
private:
    struct base_holder
    {
        virtual ~base_holder(){}
        virtual const std::type_info& type_info() const = 0;
    };
    template<typename T> struct holder : base_holder
    {
        holder(const T& t) : t_(t){}
        const std::type_info& type_info() const
        {
            return typeid(t_);
        }
        T t_;
    };
private:
    base_holder* held_;
};
int main() 
{
    any a(2);
    std::cout << a.cast<int>() << std::endl;
    any b(std::string("abcd"));
    try
    {
        std::cout << b.cast<double>() << std::endl;
    }
    catch(const std::exception& e)
    {
        std::cout << e.what() << std::endl;
    }
    return 0;
}

Скажите, будет ли быстрее это творение работать, если вместо механизма typeid, приведенного здесь, использовать std::is_same?

Answer 1

Использовать std::is_same здесь в принципе нельзя, так как тип хранимого элемента неизвестен на стадии компиляции. Конструкция typeid(var) - конструкция времени выполнения.

READ ALSO
Трёхмерный std::veсtor

Трёхмерный std::veсtor

По долгу службы пришлось иметь дело с трёхмерными векторамиПодкиньте примерчик создания, и работы с трёхмерным вектором, в котором вложенные...

353
SQL составной Primary key и Foreign key

SQL составной Primary key и Foreign key

Имеется БД с двумя таблицами

341
составить SQL запрос из двух таблиц

составить SQL запрос из двух таблиц

Достаточно распространенный способ хранения теговЕсть две таблицы: tags (хранит теги) и tags_relations (хранит связи тегов с другими сущностями) Каким...

303