Какой смысл для std :: c ++ 17? [Дубликат]

(источник из здесь .)

Обозначение квадратной скобки позволяет использовать символы, которые нельзя использовать с точечной нотацией:

var foo = myForm.foo[]; // incorrect syntax
var foo = myForm["foo[]"]; // correct syntax
blockquote>

Во-вторых, обозначения квадратной скобки полезны при работе с именами свойств, которые меняются предсказуемым образом:

for (var i = 0; i < 10; i++) {
  someFunction(myForm["myControlNumber" + i]);
}
blockquote>

Roundup:

  • Точечная запись быстрее записывается и читается.
  • Обозначение квадратной скобки позволяет получить доступ к свойствам, содержащим специальные символы и выбор свойств с использованием переменных
blockquote>

Другим примером символов, которые нельзя использовать с точечной нотацией, являются имена свойств , которые сами содержат точку .

Например, Ответ json может содержать свойство, называемое bar.Baz.

var foo = myResponse.bar.Baz; // incorrect syntax
var foo = myResponse["bar.Baz"]; // correct syntax

19
задан Konstantin 23 April 2009 в 10:41
поделиться

6 ответов

Я считаю, что Boost.Variant всегда должен быть предпочтительным, поскольку он не является навязчивым и все еще требует очень структурированного программирования.

Но я предполагаю, что основная идея boost.any - предоставить эквивалент типов объектов java и c #. Это способ сказать «да, мы можем»! : -)

6
ответ дан Benoît 28 August 2018 в 20:59
поделиться
  • 1
    Boost.Variant не может заменить Boost.Any в том случае, если тип, который будет удерживаться, известен во время выполнения. Например, см. Ссылку, упомянутую в комментарии SCFrench: ddj.com/cpp/184403808 – amit_grepclub 8 December 2010 в 14:16
  • 2
    -1. Boost.any может хранить все типы, даже примитивные, а не только c # / java & quot; object & quot; эквиваленты. – Macke 22 October 2014 в 07:29
  • 3
    @Macke Не говорите C # / java в этом случае. C # (CLR) может хранить примитивное значение в объекте. Языки могут выглядеть схожими, но они различаются. – erikkallen 28 November 2014 в 22:46

Мы используем boost.any как тип несущей для контейнера с переменным типом с маркировкой. Вот что это значит:

У нас есть объект «плот», который проходит через набор фильтров. Когда фильтр хочет добавить данные на плот, он может сделать что-то вроде этого:

raft.addTaggedData<ETag1>(3.0);
raft.addTaggedData<ETag2>("a string")`;
std::string str = raft.getTaggedData<ETag2>();
int a = raft.getTaggedData<ETag1>(); // <-- Compile error

Где ETag1 и ETag2 являются членами перечисления, и мы используем шаблон признаков для сопоставления теги к типам.

Класс raft использует list из pair<ETagType, boost::any> в качестве хранилища резервных копий. Boost.any спасли нам боль от управления буферами сырья для разных типов.

2
ответ дан Ben Straub 28 August 2018 в 20:59
поделиться
  • 1
    Используя немного boost.MPL, вы можете использовать boost.Variant вместо Boost.Any. – Benoît 23 April 2009 в 16:10
  • 2
    Даже использование boost.any было даже немного растянуто; моя команда консервативна, когда дело доходит до функций C ++. Плюс, я еще не узнал MPL. :) – Ben Straub 24 April 2009 в 02:49
  • 3
    @ Benoît Boost.Variant потребовал бы, чтобы плот знал все возможные теги (или, по крайней мере, их типы значений). Это может быть невозможно, если, например, плот плавает через независимые модули, которые таким образом могут хранить частные данные. Или даже если это возможно, это может быть нежелательно из-за увеличения исходных зависимостей, подразумеваемых таким образом. Хотя Boost.Any увеличивает затраты времени на запуск, поэтому это компромисс. – Adam Badura 15 February 2017 в 23:17

Почему одна и та же функциональность не может быть достигнута за счет наличия определенного типа в корне иерархии объекта и создания контейнеров с этим базовым типом?

Это вызывает иерархию объектов - конструкция, которую вы искусственно впрыскиваете в конструкцию для решения периферийной проблемы. Кроме того, такая конструкция легко ошибиться, и неправильная реализация может нанести ущерб. Boost.Any - сообщество рассмотрело безопасную, хорошо протестированную альтернативу.

Не могли бы вы привести несколько примеров реальной жизни?

TinyJSON использует boost.Any.

В чем преимущества использования библиотеки boost.any?

Я ссылаюсь на вводную документацию.

3
ответ дан dirkgently 28 August 2018 в 20:59
поделиться
  • 1
    Представить JSON в C ++ boost::variant<T...>, на мой взгляд, лучший выбор. – jk. 23 April 2009 в 11:04
  • 2
    Я не писал эту библиотеку :-) Я уверен, что у вас есть веские причины. – dirkgently 23 April 2009 в 11:10

Мы использовали его на карте свойств (std::map<std::string, boost::any>), чтобы динамически хранить много вещей в простой плоской дате.

В основном мы либо храним smart-ptr-to- сценариев-объектов или строк, но некоторые записи, в которых используются другие типы (float, vec3f, матрицы и другие нестандартные объекты).

Он отлично работает для добавления дополнительных динамических возможностей на c ++ или где угодно некоторое стирание типа, чтобы просто добавлять любые типы данных к объекту.

3
ответ дан Macke 28 August 2018 в 20:59
поделиться

boost :: any будет с удовольствием хранить int и floats, типы, у которых явно нет базовых классов. Реальный пример, где вы можете использовать его, - это виртуальная машина для высокоуровневого языка. Объектам «функции» потребуется массив аргументов. Это можно легко реализовать с помощью std::list<boost::any> за кулисами.

21
ответ дан MSalters 28 August 2018 в 20:59
поделиться

Когда я впервые узнал о Boost, я нашел эту статью Хербом Саттером и Джимом Хислопом в докторе Доббсе. Я нашел это полезным.

5
ответ дан SCFrench 28 August 2018 в 20:59
поделиться
Другие вопросы по тегам:

Похожие вопросы: