std::setw
manipülatörünün (veya işlevinin width
) nasıl kalıcı olarak ayarlanabileceği herhangi bir yol var mı? Şuna bak: koştuktan sonra"Kalıcı" std :: setw
#include <iostream>
#include <iomanip>
#include <algorithm>
#include <iterator>
int main(void)
{
int array[] = { 1, 2, 4, 8, 16, 32, 64, 128, 256 };
std::cout.fill('0');
std::cout.flags(std::ios::hex);
std::cout.width(3);
std::copy(&array[0], &array[9], std::ostream_iterator<int>(std::cout, " "));
std::cout << std::endl;
for(int i = 0; i < 9; i++)
{
std::cout.width(3);
std::cout << array[i] << " ";
}
std::cout << std::endl;
}
, görüyorum:
001 2 4 8 10 20 40 80 100
001 002 004 008 010 020 040 080 100
yani Her manipülatör, her giriş için ayarlanması gereken setw
/width
dışında yerini tutar. std::copy
'un (veya başka bir şeyin) setw
ile birlikte nasıl kullanıldığını gösteren herhangi bir zarif yöntem var mı? Ve zarif olarak, kesinlikle kendi functor veya std::cout
içine yazı yazmak için fonksiyon yaratmayı kastetmiyorum.
Gerçekten güzel bir tasarım bence uygulanabilir olacağını birçok durum için. Eğer genişlik bir çalışma zamanı (derleme zamanı yerine) olabilirse de bu ideal olurdu, ancak bu bilgiyi “ostream_iterator” içine almak için güzel bir yol düşünemiyorum. Ayrıca bir kolaylık fonksiyonu sağlayabilirsiniz 'template with_width (T v) {return FixedWidthVal (v, genişlik); türünü belirtmek zorunda olmak. –
@j_random_hacker Eh, kredi vadesi nerede kredi vermeliyim. Bu yaklaşımı [codereview sorusu] 'dan (http://codereview.stackexchange.com/q/18291/35254), sadece veri türü şablon parametresini ekleyerek kabul ettim. Kolaylık işlevi için güzel öneri. – chappjc