2012-10-15 19 views
8

Bazı matematik dersleri (matris, vektör vb.) Için ostream işleçlerini sağlamayı düşünüyorum Bir arkadaşım,kullanıcısınınoperatörünün gcc standart kütüphane uygulamasının iç kullanımını içerdiğini belirtti. bir dizi akımı gerçek ostream geçirmeden önce çıkış biçimlendirmek için:Orijinli fonksiyonun kullanımı

/// Insertion operator for complex values. 
template<typename _Tp, typename _CharT, class _Traits> 
    basic_ostream<_CharT, _Traits>& 
    operator<<(basic_ostream<_CharT, _Traits>& __os, const complex<_Tp>& __x) 
{ 
    basic_ostringstream<_CharT, _Traits> __s; 
    __s.flags(__os.flags()); 
    __s.imbue(__os.getloc()); 
    __s.precision(__os.precision()); 
    __s << '(' << __x.real() << ',' << __x.imag() << ')'; 
    return __os << __s.str(); 
} 

Bu model yanı sıra boost görülebilir. Bunun takip etmeye değer bir kalıp olup olmadığını belirlemeye çalışıyoruz. Dize akışı için fazladan bir başlık eklenmesini içerdiği ve potansiyel olarak önlenebilecek olan dize akışı içinde gerekli ek yığın ayırmalarının olduğu endişeleri olmuştur.

En makul istemci bu işlevselliği gerektiriyorsa, o zaman dize akışı yaratır ve yapabileceği ileri sürülmüştür kendilerini ön geçmektedir.

Bunun iyi bir uygulama olarak kabul edilip edilmediğini ve benimsenmesi gerekip gerekmediğini anlayabilmemde bana kim yardımcı olabilir? Bu modelin

cevap

6

Eğer ostream üzerinde bir çıkış genişliğini ayarlamak ne olur düşünün, o zaman bir std yazma :: buna kompleks - Sadece (yani '(' karakteri) ilk çıkış işlemini etkilemesi sen

genişliğini istemiyoruz
std::complex i(0, 1); 
std::cout << std::setw(10) << std::left << i; 

Bu çıkış onur alan genişliği ve dere üzerinde ayarlanmış diğer biçimlendirme bayrakları dışarı yazma sonra tek dize olarak tüm çıkış oluşturulmasıyla değil "(         0,1)"

"(0,1)     " yazdırmalısınız. Başka bir yanıt alıntı

2

Bir birincil amacı, orijinal streamin manipülatörler/bayrakları istinat ve dönmeden önce onları sıfırlama kaçınmaktır. Boost.IoStateSavers, bunun gerekliliğini ortadan kaldırır, bu yüzden söz konusu kütüphaneyi kullanmanın daha iyi bir uygulama olacağını söyleyebilirim.

4

parçacığı nedeni gerçekten çalışmaz: birden çok iş parçacığı çağrılan zaman bu operasyonlar atomik değildir çünkü dize hala akışı tampon düzeyinde bölünmüş alabilirsiniz. geçici biçim bayrak ayarlarını değiştirmek istediğiniz belirli çıkışları için

  1. :

    Ancak alakalı iki husus vardır. Örneğin, belirli dizginin altılık notasyonu kullanarak, diğer dec gösteriminde ve akışını orijinal durumuna geri yüklemek istediğinizden emin olmak istersiniz.

  2. Daha da önemlisi, bir çıktının width() anlamı, tüm biçimlendirme dizesinin en azında yer alması gereken karakter sayısıdır. Çıkış operatörlerini başka bir çıkış operatörüne dahili olarak kullanırsanız, ilk öğeyi, birden çok bileşenden oluşan sonuç dizgesini değil, genişliği kaplayacaksınız. Örneğin, karmaşık bir sayı için gerçek eleman, gerçek eleman, virgül ve hayali öğenin birleşimi yerine width()'u işgal eder.
İlgili konular