argv[0]
всегда имя исполняемого файла. (Это означает, что argc > 0
всегда верно.) Если вы хотите выводить широкие символы (я думаю, _TCHAR
отображается на wchar_t
, BICBWT), вы не должны использовать узкий вывод. В 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
) в зависимости от некоторого определения.
Прежде всего: Вам действительно нужно это переключение? На практике, когда вам нужны широкие символы, чаще всего они вам действительно нужны, и программа не будет правильно работать с узкими символами.
Таким образом, очень вероятно, что вы можете просто использовать чисто широкие символы, избавиться от переключения и использовать приведенный выше код, как написано.
Однако, если вам действительно нужно переключиться, вам нужно переключаться между узкими и широкими консольными потоками самостоятельно. (Это верно только для консольных потоковых объектов, кстати. Для ваших собственных потоков, например, файловых потоков, вы можете просто использовать _TCHAR
и позволить компилятору выяснить остальное: std::basic_ofstream<_TCHAR>
.) Один из способов сделать это будет чертой класса:
//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');