Стандарт C ++ 11 указывает, что vwscanf
доступно через заголовок <cwchar>
(и, следовательно, <wchar.h>
). Однако в Visual C ++ этого, похоже, не хватает. С помощью этой функции я мог написать & hellip;
inline int scanf( CodingValue const* format, ... )
{
va_list args;
va_start( args, format );
return ::vwscanf( format->ptr(), args );
}
но без него, т. Е. С Visual C ++ 10.0, в котором также отсутствует поддержка вариабельных шаблонов C ++ 11, я уменьшен до написания & hellip;
inline int scanf(
CodingValue const* format,
void* a01 = 0, void* a02 = 0, void* a03 = 0, void* a04 = 0, void* a05 = 0,
void* a06 = 0, void* a07 = 0, void* a08 = 0, void* a09 = 0, void* a10 = 0,
void* a11 = 0, void* a12 = 0
)
{
int const nArgs = !!a01 + !!a02 + !!a03 + !!a04 + !!a05 + !!a06 +
!!a07 + !!a08 + !!a09 + !!a10 + !!a11 + !!a12;
BasicCodingValue const* const f = format->ptr();
switch( nArgs )
{
case 0: return ::wscanf( f );
case 1: return ::wscanf( f,a01 );
case 2: return ::wscanf( f,a01,a02 );
case 3: return ::wscanf( f,a01,a02,a03 );
case 4: return ::wscanf( f,a01,a02,a03,a04 );
case 5: return ::wscanf( f,a01,a02,a03,a04,a05 );
case 6: return ::wscanf( f,a01,a02,a03,a04,a05,a06 );
case 7: return ::wscanf( f,a01,a02,a03,a04,a05,a06,a07 );
case 8: return ::wscanf( f,a01,a02,a03,a04,a05,a06,a07,a08 );
case 9: return ::wscanf( f,a01,a02,a03,a04,a05,a06,a07,a08,a09 );
case 10: return ::wscanf( f,a01,a02,a03,a04,a05,a06,a07,a08,a09,a10 );
case 11: return ::wscanf( f,a01,a02,a03,a04,a05,a06,a07,a08,a09,a10,a11 );
case 12: return ::wscanf( f,a01,a02,a03,a04,a05,a06,a07,a08,a09,a10,a11,a12 );
}
}
Или я мог бы сделать какую-то сборку, как я это делал 15 лет назад, когда столкнулся с похожей (или, возможно, той же) проблемой, но это не совсем правильно.
Можете ли вы предложить лучший способ?