2016-11-27 29 views
3

マニピュレータは、どのように動作するのかを完全に理解することなくしばらく使用しています。std :: uppercaseが文字列で機能しないのはなぜですか?

このコード:

std::cout << std::hex << std::showbase; 
std::cout << std::uppercase << 77 << '\n'; 
std::cout << std::nouppercase << 77 << '\n'; 

または代替的に、この:

std::cout << std::hex; 
std::cout << std::setiosflags(std::ios::showbase | std::ios::uppercase) << 77 << '\n'; 
std::cout << std::nouppercase << 77 << '\n'; 

両方出力する。

0X4D // 'X' and 'D' uppercase 
0x4d // 'x' and 'd' lowercase 

しかし次のコード行のいずれも文字列「ABCDに変換することができません"を大文字に変換します。どうして? showbaseuppercasestd::setiosflags()内部でのみ、その関数の外側std::std::ios::で修飾されなければならない理由

std::cout << std::uppercase << "abcd" << '\n'; 
std::cout << std::setiosflags(std::ios::uppercase) << "abcd" << '\n'; 

もう一つの問題はありますか?

std::hexstd::setiosflags()

の内側に受け入れることができない理由Finalyは、

答えて

6

std::uppercaseのドキュメントを読む。

浮動小数点および16進整数出力で大文字を使用できるようにします。

std::ios_base::hexdocsの例があるstd::setiosflagsによって受け入れられます。ここ

std::uppercaseための一例である:ここ

#include <iostream> 
int main() 
{ 
    std::cout << std::hex << std::showbase 
       << "0x2a with uppercase: " << std::uppercase << 0x2a << '\n' 
       << "0x2a with nouppercase: " << std::nouppercase << 0x2a << '\n' 
       << "1e-10 with uppercase: " << std::uppercase << 1e-10 << '\n' 
       << "1e-10 with nouppercase: " << std::nouppercase << 1e-10 << '\n'; 
} 

std::setiosflagsための例である:

#include <iostream> 
#include <iomanip> 

int main() 
{ 
    std::cout << std::resetiosflags(std::ios_base::dec) 
       << std::setiosflags( std::ios_base::hex 
            | std::ios_base::uppercase 
            | std::ios_base::showbase) << 42 << '\n'; 
} 

定義:

std::hexstd::ios_base& hex(std::ios_base& str);

のように定義されますは、static constexpr fmtflags hex = /*...*/;

2

std::uppercaseだけ進への変換の結果に影響を与えていただきありがとうございます。

std::hexはマニピュレータオブジェクトであり、setiosflagsは個々のビットを組み合わせて形成される整数を期待しています。あるいは、より正確には、そのような振る舞いをするタイプです。 std::hex(間違ったタイプのもの)の代わりに、std::ios_base::hexを使用できます。

関連する問題