как делают Вы делаете неоднородное повышение:: карта?

Как я могу получить путь к файлу из этого типа URI контента?

У вас нет, так как нет никакого файла вообще за Uri, не говоря уже о том, к которому вы можете получить доступ. Это Uri может указывать на:

  • Локальный файл на внешнем хранилище
  • Локальный файл на внутренней памяти для другого приложения
  • Локальный файл на съемном носителе
  • Локальный файл, который зашифрован и должен быть дешифрован на лету
  • Поток байтов, хранящихся в столбце BLOB в базе данных
  • Часть содержимого, которое должно быть загружено другим приложением первым
  • ... и т. д.

Все другие приложения, такие как Facebook, Google+ это делает

Нет, это не так. Они используют ContentResolver и:

  • openInputStream() для чтения в байтах, связанных с содержимым
  • getType(), чтобы получить тип MIME, связанный с содержимым
  • query() и OpenableColumns, чтобы получить размер и отображаемое имя, связанные с контентом
31
задан Piotr Dobrogost 11 July 2009 в 19:37
поделиться

5 ответов

#include <map>
#include <string>
#include <iostream>
#include <boost/any.hpp>

int main()
{
    try
    {
        std::map<std::string, boost::any> m;
        m["a"]  = 2;
        m["b"]  = static_cast<char const *>("black sheep");

        int i = boost::any_cast<int>(m["a"]);
        std::cout << "I(" << i << ")\n";

        int j = boost::any_cast<int>(m["b"]); // throws exception
        std::cout << "J(" << j << ")\n";
    }
    catch(...)
    {
        std::cout << "Exception\n";
    }

}
38
ответ дан 27 November 2019 в 22:00
поделиться

, Как может, я создаю < любимый контейнер> объектов различных типов?

Вы не можете, но можно фальсифицировать его вполне прилично. В C/C++ все массивы являются гомогенными (т.е. элементы являются всеми одинаковыми тип). Однако с дополнительным слоем косвенности можно дать появление неоднородного контейнера (неоднородный контейнер является контейнером, где содержащие в нем объекты имеют различные типы).

существует два случая с неоднородными контейнерами.

первый случай происходит, когда все объекты, которые Вы хотите хранить в контейнере, публично получены из общего базового класса. [...]

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

10
ответ дан 27 November 2019 в 22:00
поделиться

Был бы повышение:: какой-либо добиваются цели для Вас?

8
ответ дан 27 November 2019 в 22:00
поделиться

David спасибо, в именно это я нуждался. Вот рабочее решение.

#include <iostream>
using std::cout;
using std::endl;

#include <map>
#include <boost/any.hpp>

using boost::any_cast;
typedef std::map<std::string, boost::any> t_map;


int main(int argc, char **argv)
{

  t_map map;
  char *pc = "boo yeah!";

  map["a"] = 2.1;
  map["b"] = pc;

  cout << "map contents" << endl;
  cout << any_cast<double>(map["a"]) << endl;
  cout << any_cast<char*>(map["b"]) << endl;

  return 0;
}
6
ответ дан 27 November 2019 в 22:00
поделиться

Если Вы хотите, чтобы ограниченный набор типов поддерживался, Повышение. Вариант должен добиться цели.

5
ответ дан 27 November 2019 в 22:00
поделиться
Другие вопросы по тегам:

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