(Повышение) Зачем нам нужен универсальный тип? - PullRequest
1 голос
/ 24 мая 2011

зачем нам универсальный тип, указанный в библиотеке Boost?Разве шаблон не достаточно?Например, если я хочу контейнер определенного типа, я бы просто сделал:

template<class Type>
vector<Type> v;

Если я хочу указать контейнер, который содержит все, я просто пишу:

vector v;

В объяснении для boost :: any (http://www.boost.org/doc/libs/1_46_1/doc/html/any/s02.html)

Преобразование типов, которые могут содержать один из нескольких возможных типов значений, например, int и string, и свободное преобразование между ними, например интерпретация 5как "5" или наоборот. Такие типы распространены в сценариях и других интерпретируемых языках. boost :: lexical_cast поддерживает такие функции преобразования.

Почему нам нужен неявный тип, как в языках сценариев, таких какPHP?

Более того, в примере boost :: any почему:

using boost::any_cast;
typedef std::list<boost::any> many;

void append_int(many & values, int value)
{
    boost::any to_append = value;
    values.push_back(to_append);
}

приемлемо? Использует ли контейнер оператор = реализованный в boost :: any?

any & operator=(const any &);

, что делает boost :: any способным содержать любой тип? Оператор =, определенный в boost :: any, объясняется как:

Эффекты: копирует содержимое rhs в текущий экземпляр, отбрасываяPrevious содержимое, так что новое содержимое эквивалентно по типу и значению содержимому rhs или пусто, если rhs.empty ().

Броски: std :: bad_alloc или любые исключения, возникающие из конструктора копированиясодержавшегося типа.Назначение удовлетворяет строгой гарантии исключительной безопасности.

http://www.boost.org/doc/libs/1_46_1/doc/html/boost/any.html

Ответы [ 3 ]

6 голосов
/ 24 мая 2011

Поскольку C ++ не имеет универсальный тип.Он имеет шаблоны типов, которые составляются для каждого замещенного типа отдельно.Выражение

vector v;

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

Существует несколькоуниверсальный тип в C ++, void*, но тогда вы обязаны помнить, что вы хранили в нем (особенно в целях удаления).boost::any - это безопасная альтернатива, которая запоминает то, что вы там хранили, и выдает ошибку, если вы попытаетесь преобразовать ее во что-то, в чье преобразование не было определено (вам все равно придется запросить фактическое значение на any_cast).

Что касается operator=, то да, он используется контейнером.Стандартные контейнеры обычно требуют, чтобы тип элемента был конструируемым и присваиваемым по умолчанию, что означает, что им нужно иметь конструктор рабочей копии и оператор присваивания.Как правило, они либо не должны быть конструируемыми по умолчанию, либо должны быть конструктивными по умолчанию, если вы используете определенные операции.

1 голос
/ 24 мая 2011

Зачем нам нужен неявный тип, как в языках сценариев, таких как PHP?

См. Более экстремальный пример . Если кто-то это делает, то, видимо, это нужно.

0 голосов
/ 24 мая 2011

Поскольку разрешение типа шаблона является временем компиляции, а разрешение типа boost::any - временем выполнения.boost::any - это одна из тех вещей, которых вам следует избегать, насколько это возможно, но в тех немногих случаях, когда его использование оправдано, оно действительно вам нужно - больше ничего не подойдет.

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