2017-09-29 6 views
2

Ceci est une question académique.Mise en forme cout cout

sdt::mutex m; 
typedef std::lock_guard<std::mutex> G; 

void thread1(){ 
    G g(m);  
    std::cout << std::setw(9); 
    std::cout << 3.14; 
    std::cout << std::endl; 
} 

void thread2(){ 
    G g(m);  
    std::cout << std::setw(7); 
    std::cout << 3.14; 
    std::cout << std::endl; 
} 

Mon problème est que la mise en forme est lié au flux de sortie, donc je dois mettre toutes les options de formatage jamais inventées sur mon fil si je veux être sûr de la sortie que je produis. Ce qui fonctionnera ou ne fonctionnera pas l'année prochaine. Y at-il un moyen de réinitialiser le formatage par défaut sans tout régler manuellement?

  • Sinon, quelles sont les bonnes solutions de contournement?
    • Par exemple dois-je créer et garder un std::ostringstream localement sur mon fil et écrire oss.str() à std::cout?
+0

quelle norme de C++? –

+0

@RichardHodges C++ 14 – Notinlist

+1

Alors, quelle est la question? Peut-être que vous voulez [réinitialiser l'état de 'std :: cout' après avoir manipulé le flux] (https://stackoverflow.com/questions/2273330/restore-the-state-of-stdcout-after-manipulating-it)? – Ron

Répondre

2

Je l'ai utilisé pour stimuler la concision mais vous pouvez écrire votre propre écran en option et de l'État.

#include <mutex> 
#include <iostream> 
#include <iomanip> 
#include <tuple> 
#include <utility> 
#include <boost/io/ios_state.hpp> 
#include <boost/optional.hpp> 

std::mutex m; 

struct save_and_lock 
{ 
    boost::optional<boost::io::ios_all_saver> saver; 
    std::unique_lock<std::mutex> lock; 

    void init(std::ostream& os) 
    { 
     lock = std::unique_lock<std::mutex>(m); 
     saver.emplace(os); 
     os.flags(std::ios_base::fmtflags(0)); 
    } 

    friend std::ostream& operator<<(std::ostream& os, save_and_lock&& s) 
    { 
     s.init(os); 
     return os; 
    } 
}; 

void thread1(){ 
    std::cout << save_and_lock() << std::setw(9) << 3.14 << std::endl; 
} 

void thread2(){ 
    std::cout << save_and_lock() << std::setw(9) << 3.14 << std::endl; 

} 

Cela fonctionne parce que l'ordre d'évaluation de la gauche vers la droite operator << défini par l'utilisateur.

+0

Woa! Je ne savais pas qu'une fonction amie pouvait être implémentée là. Depuis quand? Googling ... Depuis toujours! Woa! – Notinlist

+0

@Notinlist C++ est plein de surprises hein? –