argv[0]
は常に実行可能ファイルの名前です。(これargc > 0
は常に真であることを意味します。) ワイド文字を出力したい場合 ( BICBWT に_TCHAR
マップすると思いますwchar_t
)、ナロー出力を使用してはなりません。C++ では、出力ストリームを使用して出力が行われます。ワイド コンソール出力ストリームはstd::wcout
.
#include <iostream>
//Beware, brain-compiled code ahead!
template< typename InpIt >
void output(InpIt begin, InpIt end)
{
while(begin != end)
std::wcout << *begin++ << L'\n';
}
int _tmain(int argc, _TCHAR* argv[])
{
std::wcout << L"num arguments: " << std::argc << L'\n';
output(argv+1, argv+argc)
return 0;
}
Rupが言及しているように、定義に応じて_TCHAR
その値(char
または)を変更します。wchar_t
何よりもまず、この切り替えが本当に必要ですか? 実際には、幅の広い文字が必要な場合は、ほとんどの場合、実際に幅の広い文字が必要になり、プログラムは幅の狭い文字では正しく動作しません。
したがって、純粋なワイド文字に落ち着いて、切り替えを取り除き、上記のコードを記述どおりに使用できる可能性が非常に高くなります。
ただし、本当に切り替える必要がある場合は、狭いコンソール ストリームと広いコンソール ストリームを自分で切り替える必要があります。(これは、コンソール ストリーム オブジェクト、BTW にのみ当てはまります。独自のストリーム、たとえばファイル ストリームの場合は、 を使用_TCHAR
して、コンパイラに残りを理解させる ことができますstd::basic_ofstream<_TCHAR>
。) これを行う 1 つの方法は、trait です。クラス:
//Beware, brain-compiled code ahead!
template< typename Char >
struct console_stream_traits; // leave undefined
template<>
struct console_stream_traits<char> {
typedef std::basic_ostream<char> ostream;
typedef std::basic_istream<char> istream;
std::basic_ostream<char>& cout = std::cout;
std::basic_ostream<char>& cerr = std::cerr;
std::basic_ostream<char>& clog = std::clog;
std::basic_istream<char>& cin = std::cin;
};
template<>
struct console_stream_traits<wchar_t> {
typedef std::basic_ostream<wchar_> ostream;
typedef std::basic_istream<wchar_> istream;
std::basic_ostream<wchar_t>& cout = std::wcout;
std::basic_ostream<wchar_t>& cerr = std::wcerr;
std::basic_ostream<wchar_t>& clog = std::wclog;
std::basic_istream<wchar_t>& cin = std::wcin;
};
typedef console_stream_traits<_TCHAR> my_ostream;
typedef my_console_stream_traits::ostream my_ostream;
typedef my_console_stream_traits::ostream my_ostream;
my_ostream& my_cout = my_console_stream_traits::cout;
my_ostream& my_cerr = my_console_stream_traits::cerr;
my_ostream& my_clog = my_console_stream_traits::clog;
my_istream& my_cin = my_console_stream_traits::cin;
これにより、上記の関数のループは次のoutput()
ようになります。
while(begin != end)
my_cout << *begin++ << _T('\n');