2016-10-16 2 views
2

«Handling map of files in c++» говорит «нет», следует использовать std::map<std::string, std::ofstream*>, но это приводит к действиям new и delete, что не так просто.Можно ли обрабатывать std :: ofstream с std :: map?

С "Is std::ofstream movable? Да!" и возможно «std::map<>::insert using non-copyable objects and uniform initialization», можно ли обрабатывать коллекцию ofstream с использованием std::map? так что вы не будете беспокоиться о закрытии фильтров и delete для освобождения памяти.

Я могу скомпрометировать, что при использовании std::map<std::string, std::ofstream> создайте, используйте (чтобы написать) и закрыть, а не копировать.

+0

"так что никто не будет беспокоиться о закрытии и потокового видео удалить, чтобы освободить память". Для этого нужны интеллектуальные указатели (если семантика перемещения не работает для вас, или вы хотите использовать полиморфные потоки). –

+0

, но сам поток тоже делает это, правильно? если карта выходит за пределы области видимости, будет вызываться ее деструктор, который снова вызовет деструктор всех элементов, то есть из потока, тогда все файлы будут закрыты должным образом. – athos

ответ

2

Да, это возможно. См. Пример кода ниже.

Я могу скомпрометировать, что при использовании std::map<std::string, std::ofstream> создайте, используйте (чтобы написать) и закрыть, а не копировать.

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

#include <iostream> 
#include <fstream> 
#include <map> 

int main() 
{ 
    std::map<std::string, std::ofstream> map; 
    map.emplace("foo", std::ofstream("/tmp/foo")); 
    map.emplace("bar", std::ofstream("/tmp/bar")); 

    map["foo"] << "test"; 
    map["foo"].flush(); 

    std::ifstream ifs("/tmp/foo"); 
    std::string data; 
    ifs >> data; 

    std::cout << data << '\n'; 

    return 0; 
} 

Выход:

тест

+1

Вы можете опустить операцию перемещения, этот код будет строить объект outstream и переместить его в хранилище std :: map. 'map.emplace ("foo", "/ tmp/foo");' построит объект на месте. – TimVdG

Смежные вопросы