Как я могу добавить отражение к приложению C++?

Способ получения безопасного изображения и работы с Swift 2.0 и X-Code 7.1:

static func imageForImageURLString(imageURLString: String, completion: (image: UIImage?, success: Bool) -> Void) {
    guard let url = NSURL(string: imageURLString),
        let data = NSData(contentsOfURL: url),
        let image = UIImage(data: data)
        else { 
            completion(image: nil, success: false); 
            return 
       }

    completion(image: image, success: true)
}

Затем вы вызываете этот метод следующим образом:

imageForImageURLString(imageString) { (image, success) -> Void in
        if success {
            guard let image = image 
                 else { return } // Error handling here 
            // You now have the image. 
         } else {
            // Error handling here.
        }
    }

Если вы обновляете представление с изображением, вам придется использовать его после «if success {»:

    dispatch_async(dispatch_get_main_queue()) { () -> Void in
         guard let image = image 
              else { return } // Error handling here 
         // You now have the image. Use the image to update the view or anything UI related here
         // Reload the view, so the image appears
    }

. Причина, по которой эта последняя часть необходима, если вы используете изображение в пользовательский интерфейс связан с тем, что сетевые вызовы требуют времени. Если вы попытаетесь обновить пользовательский интерфейс, используя изображение, не вызывая dispatch_async, как показано выше, компьютер будет искать изображение, пока изображение все еще будет извлечено, найдите, что изображения нет (пока), и двигайтесь так, как если бы не было изображения найденный. Поместив свой код в завершение закрытия dispatch_async, он говорит компьютеру: «Идите, получите это изображение, и когда вы закончите, заполните этот код». Таким образом, вы получите изображение, когда код будет вызван, и все будет хорошо работать.

242
задан Lazer 20 June 2010 в 17:10
поделиться

14 ответов

Простой путь состоит в том, чтобы использовать dynamic_cast<>() оператор, который, когда присвоено неправильному типу, возвращает ПУСТОЙ УКАЗАТЕЛЬ, таким образом, Вы можете восходящий к основному реальному классу в простом способе, проверяя значение указателя, если это не является ПУСТЫМ, бросок был сделан, и Вы получили тип объекта.

, Но это - просто простое решение, и оно только обеспечивает тип объектов, Вы не можете спросить, как какие методы оно имеет, в Java. При необходимости в передовом решении существуют некоторые платформы для выбора из.

-4
ответ дан RandomDSdevel 27 June 2019 в 07:13
поделиться

Что Вы пытаетесь сделать с отражением?
можно использовать Повышение черты типа и typeof библиотеки как ограниченная форма отражения времени компиляции. Таким образом, можно осмотреть и изменить основные свойства типа, переданного шаблону.

13
ответ дан Ferruccio 23 November 2019 в 03:12
поделиться

Два подобных отражению решения, о которых я знаю с моих дней C++:

1) RTTI Использования, который предоставит начальную загрузку Вам для создания подобного отражению поведения, если Вы будете в состоянии заставить все свои классы происходить из 'объектного' базового класса. Тот класс мог предоставить некоторые методы как GetMethod, GetBaseClass и т.д. Что касается того, как те методы работают, необходимо будет вручную добавить некоторые макросы для украшения типов, которые негласно создают метаданные в типе для предоставления ответов на GetMethods и т.д.

2) Другая опция, если у Вас есть доступ к объектам компилятора, должен использовать DIA SDK. Если я помню правильно, что это позволяет Вам открыть pdbs, который должен содержать метаданные для Ваших типов C++. Могло бы быть достаточно сделать то, в чем Вы нуждаетесь. Эта страница показывает, как можно получить все базовые типы класса, например.

Оба они решение немного ужасны хотя! Нет ничего как немного C++, чтобы заставить Вас ценить роскошь C#.

Удачи.

9
ответ дан user4385 23 November 2019 в 03:12
поделиться

Я сделал что-то как то, что Вы, после однажды, и в то время как возможно получить некоторый уровень отражения и доступа к высокоуровневым функциям, головная боль обслуживания не могла бы стоить того. Моя система использовалась для хранения классов UI полностью разделенными от бизнес-логики до делегации сродни понятию Objective C передачи сообщений и передачи. Способ сделать это состоит в том, чтобы создать некоторый базовый класс, который способен к отображающимся символам (я использовал строковый пул, но Вы могли сделать это с перечислениями, если Вы предпочитаете обработку скоростной погрешности и ошибки времени компиляции по общей гибкости) к указателям функции (на самом деле не чистые указатели функции, но что-то подобное тому, что Повышение имеет с Повышением. Функция - к которому у меня не было доступа в то время). Можно сделать то же самое для членских переменных, пока у Вас есть некоторый общий базовый класс, способный к представлению любого значения. Вся система была невозмутимым грабежом Кодирования Значения ключа и Делегации с несколькими побочными эффектами, которые, возможно, стоили чистого количества времени, необходимого для получения каждого класса, который использовал систему для подхождения всех ее методов и участников с легальными вызовами: 1) Любой класс мог назвать любой метод на любом другом классе, не имея необходимость включать заголовки или базовые классы фальшивки записи, таким образом, интерфейс мог быть предопределен для компилятора; и 2) Методов get и методы set членских переменных было легко сделать ориентированным на многопотоковое исполнение, потому что изменение или доступ к их значениям всегда делались через 2 метода в базовом классе всех объектов.

Это также привело к возможности выполнения некоторых действительно странных вещей, которые иначе не легки в C++. Например, я мог создать объект Массива, который содержал произвольные объекты любого типа, включая себя, и создайте новые массивы динамично путем передачи сообщения всем объектам массива и сбора возвращаемых значений (подобный для отображения в Lisp). Другой был реализацией наблюдения значения ключа, посредством чего я смог настроить UI для непосредственного ответа на изменения в членах классов бэкенда вместо того, чтобы постоянно опросить данные или излишне перерисовать дисплей.

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

Оборотные стороны к системе, которая могла бы отговорить Вас беспокоиться: добавление всех сообщений и значений ключа чрезвычайно утомительно; это медленнее, чем без любого отражения; Вы возненавидите наблюдение boost::static_pointer_cast и boost::dynamic_pointer_cast на всем протяжении Вашей кодовой базы с сильной страстью; ограничения системы со строгим контролем типов все еще там, Вы действительно просто скрываете их немного, таким образом, это не столь очевидно. Опечатки в Ваших строках являются также не забавой или легкий обнаружить удивление.

относительно того, как реализовать что-то вроде этого: просто используйте совместно использованные и слабые указатели на некоторую общую базу (мой очень образно назвали "Объектом"), и произойдите для всех типов, которые Вы хотите использовать. Я рекомендовал бы установить Повышение. Функция вместо того, чтобы делать его способ, которым я сделал, который был с небольшим количеством пользовательского дерьма и тонной ужасных макросов для обертывания вызовов указателя функции. Так как все отображается, осмотр возражает, просто вопрос итерации через все ключи. Так как мои классы были по существу максимально близко к прямому грабежу Какао использованием только C++, если бы Вы хотите что-то как этот тогда, я предложил бы использовать документацию Какао в качестве проекта.

10
ответ дан Michel 23 November 2019 в 03:12
поделиться

Я рекомендовал бы использовать Qt.

существует лицензия с открытым исходным кодом, а также коммерческая лицензия.

13
ответ дан marvinIsSacul 23 November 2019 в 03:12
поделиться

Я думаю, что Вы могли бы найти интересным статья "Using Templates for Reflection in C ++" Dominic Filion. Это находятся в разделе 1.4 из Игровые Драгоценные камни Программирования 5 . К сожалению, я не имею своей копии со мной, но ищу ее, потому что я думаю, что она объясняет, что Вы просите.

6
ответ дан user32434999 23 November 2019 в 03:12
поделиться

Необходимо посмотреть на то, что Вы пытаетесь сделать, и если RTTI удовлетворит Ваши требования. Я реализовал свое собственное псевдоотражение в некоторых очень определенных целях. Например, я когда-то хотел быть в состоянии гибко настроить то, что произведет моделирование. Это потребовало добавления некоторого шаблонного кода к классам, которые будут произведены:

namespace {
  static bool b2 = Filter::Filterable<const MyObj>::Register("MyObject");
} 

bool MyObj::BuildMap()
{
  Filterable<const OutputDisease>::AddAccess("time", &MyObj::time);
  Filterable<const OutputDisease>::AddAccess("person", &MyObj::id);
  return true;
}

первый вызов добавляет этот объект к системе фильтрации, которая звонит BuildMap() метод для выяснения, какие методы доступны.

Затем в файле конфигурации, можно сделать что-то вроде этого:

FILTER-OUTPUT-OBJECT   MyObject
FILTER-OUTPUT-FILENAME file.txt
FILTER-CLAUSE-1        person == 1773
FILTER-CLAUSE-2        time > 2000

Через некоторое шаблонное волшебство вовлечение boost, это переводится в серию вызовов метода во времени выполнения (когда файл конфигурации прочитан), таким образом, это довольно эффективно. Я не рекомендовал бы делать это, если Вы действительно не должны, но, когда Вы делаете, можно сделать некоторый действительно интересный материал.

14
ответ дан RandomDSdevel 23 November 2019 в 03:12
поделиться

RTTI не существует для C++.

Это просто неправильно. На самом деле самый термин “RTTI” был введен стандартом C++. С другой стороны, RTTI не идет очень далеко в реализации отражения.

38
ответ дан Konrad Rudolph 23 November 2019 в 03:12
поделиться

И я любил бы пони, но пони не свободны.:-p

http://en.wikibooks.org/wiki/C%2B%2B_Programming/RTTI - то, что Вы собираетесь получить. Отражение как Вы думаете о - полностью описательные метаданные, доступные во времени выполнения - просто, не существуют для C++ по умолчанию.

57
ответ дан Brad Wilson 23 November 2019 в 03:12
поделиться

Существует два вида reflection плавание вокруг.

  1. Контроль путем итерации по членам типа, перечисления его методов и так далее.

    Это не возможно с C++.
  2. Контроль путем проверки, имеет ли тип класса (класс, структура, объединение) тип метода или вложенный тип, получен из другого конкретного типа.

    Такого рода вещь возможна с C++ с помощью template-tricks. Используйте boost::type_traits для многих вещей (как проверка, является ли тип неотъемлемой частью). Для проверки существование функции членства используйте , он возможный записать шаблон для проверки на function' s существование? . Для проверки, существует ли определенный вложенный тип, используйте плоскость SFINAE.

, Если Вы скорее ищете способы выполнить 1), как взгляд, сколько методы класс имеют, или как получение строкового представления идентификатора класса, тогда я боюсь, что нет никакого Стандартного C++ способа сделать это. Необходимо использовать любой

  • Метакомпилятор А как спокойный Компилятор Метаобъекта, который переводит код, добавляющий дополнительную meta информацию.
  • Платформа А constisting макросов, которые позволяют Вам добавлять необходимую метаинформацию. Необходимо было бы сказать платформе все методы, имена классов, базовые классы и все, в чем она нуждается.

C++ сделан со скоростью в памяти. Если Вы хотите высокоуровневый контроль, как C#, или Java имеет, то я боюсь, что должен сказать Вам, что нет никакого пути без некоторого усилия.

101
ответ дан Community 23 November 2019 в 03:12
поделиться

Можно достигнуть прохладных статических отражательных функций структур с BOOST_HANA_DEFINE_STRUCT от Повышения:: библиотека Ханы.
Хана довольно универсальна, не только для варианта использования, который Вы имеете в виду, но и для большого количества шаблонного метапрограммирования.

1
ответ дан 23 November 2019 в 03:12
поделиться

Информация существует, но не в том формате, который вам нужен, и только если вы экспортируете свои классы. Это работает в Windows, я не знаю о других платформах. Использование спецификаторов класса хранения, например:

class __declspec(export) MyClass
{
public:
    void Foo(float x);
}

Это заставляет компилятор встраивать данные определения класса в DLL / Exe. Но это не тот формат, который вы могли бы легко использовать для отражения.

В моей компании мы создали библиотеку, которая интерпретирует эти метаданные и позволяет вам отражать класс без добавления дополнительных макросов и т. Д. в сам класс. Он позволяет вызывать функции следующим образом:

MyClass *instance_ptr=new MyClass;
GetClass("MyClass")->GetFunction("Foo")->Invoke(instance_ptr,1.331);

Фактически это делает:

instance_ptr->Foo(1.331);

Функция Invoke (this_pointer, ...) имеет переменные аргументы. Очевидно, вызывая функцию таким образом, вы обойдете такие вещи, как const-security и т. Д., Поэтому эти аспекты реализованы в виде проверок времени выполнения.

Я уверен, что синтаксис можно улучшить, и он работает только в Win32 и Win64 пока что. Мы обнаружили, что это действительно полезно для создания автоматических интерфейсов GUI для классов, создания свойств на C ++, потоковой передачи в XML и из него и так далее, и нет необходимости наследовать определенный базовый класс. Если будет достаточно спроса, возможно, мы сможем придать ему форму для выпуска.

) функция имеет переменные аргументы. Очевидно, вызывая функцию таким образом, вы обойдете такие вещи, как const-security и т. Д., Поэтому эти аспекты реализованы в виде проверок времени выполнения.

Я уверен, что синтаксис можно улучшить, и он работает только в Win32 и Win64 пока что. Мы обнаружили, что это действительно полезно для создания автоматических интерфейсов GUI для классов, создания свойств на C ++, потоковой передачи в XML и из него и так далее, и нет необходимости наследовать определенный базовый класс. Если будет достаточно спроса, возможно, мы сможем придать ему форму для выпуска.

) функция имеет переменные аргументы. Очевидно, вызывая функцию таким образом, вы обойдете такие вещи, как const-security и т. Д., Поэтому эти аспекты реализованы в виде проверок времени выполнения.

Я уверен, что синтаксис можно улучшить, и он работает только в Win32 и Win64 пока что. Мы обнаружили, что это действительно полезно для создания автоматических интерфейсов GUI для классов, создания свойств на C ++, потоковой передачи в XML и из него и так далее, и нет необходимости наследовать определенный базовый класс. Если будет достаточно спроса, возможно, мы сможем придать ему форму для выпуска.

Мы обнаружили, что это действительно полезно для создания автоматических интерфейсов GUI для классов, создания свойств на C ++, потоковой передачи в XML и из него и так далее, и нет необходимости наследовать от определенного базового класса. Если будет достаточно спроса, возможно, мы сможем придать ему форму для выпуска.

Мы нашли его действительно полезным для создания автоматических интерфейсов GUI для классов, создания свойств на C ++, потоковой передачи в XML и из него и т. д., и нет необходимости наследовать от определенного базового класса. Если будет достаточно спроса, возможно, мы сможем придать ему форму для выпуска.

37
ответ дан 23 November 2019 в 03:12
поделиться

Когда мне понадобилось отражение в C ++, я прочитал эту статью и улучшил то, что я там увидел. Извините, банку нет. Я не владею результатом ... но вы определенно можете получить то, что было у меня, и продолжить работу.

В настоящее время, когда мне хочется, я изучаю методы использования inherit_linearly, чтобы значительно упростить определение отражаемых типов. На самом деле я довольно далеко продвинулся в этом, но у меня еще есть пути. Изменения в C ++ 0x, скорее всего, очень помогут в этой области.

2
ответ дан 23 November 2019 в 03:12
поделиться

EDIT: CAMP больше не поддерживается; доступны два форка:

  • Один также называется CAMP и основан на том же API.
  • Ponder - это частичный рерайт, и ему отдается предпочтение, так как он не требует Boost; он использует C++11.

CAMP - это библиотека с лицензией MIT (ранее LGPL), которая добавляет отражение в язык C++. Она не требует специального шага препроцессирования при компиляции, но привязка должна быть сделана вручную.

Текущая библиотека Tegesoft использует Boost, но есть также форк, использующий C++11, который больше не требует Boost.

13
ответ дан 23 November 2019 в 03:12
поделиться
Другие вопросы по тегам:

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