私はテンプレートプログラミングのスキルを拡張しようとしていますが、私は正しい解決策が見当たらないという問題に直面しています。 これは、より高度なテンプレート作成を行うための個人的なトレーニングです。テンプレートプログラミングに関する助けが必要
この目標は、フォーマット文字列のタイプに応じて、整数型(sprintfまたはswprintfを使用)を文字列またはwstringに変換するためのテンプレートを作成することです。 エラーチェックの必要はありません(今のところはありません)。私は可変フォーマットのCHAR型を決定する必要があることのいずれかのため"%i"
又はL"%i"
としてデフォルトリテラル値を供給する必要
(const char*) NULL
として、または(const wchar_t*) NULL
問題は形式が指定されている場合であります。 私は今、SFINAEを使ってそのための関数を使用しています。 しかし、私はそのための変数を使用したいと思いますが、私はSFINAY varaiablesで動作しないと思う(または私は間違っています)。ここで
は、これまでのところ、私の(作業)コードです:
////////////////////////////////////////////////////////////////////////////////
template < typename T ,typename I >
inline
typename std::enable_if< std::is_same< T ,char >::value ,int >::type
str_printf (T* szBuff ,int iLen ,const T* szFrmt ,I iNum)
{ return sprintf_s(szBuff ,iLen ,szFrmt ,iNum); }
template < typename T ,typename I >
inline
typename std::enable_if< std::is_same< T ,wchar_t >::value ,int >::type
str_printf (T* szBuff ,int iLen ,const T* szFrmt ,I iNum)
{ return swprintf_s(szBuff ,iLen ,szFrmt ,iNum); }
////////////////////////////////////////////////////////////////////////////////
template < typename T >
inline
typename std::enable_if< std::is_same< T ,char >::value ,const char* >::type
Dflt_Frmt() { return "%i"; }
template < typename T >
inline
typename std::enable_if< std::is_same< T ,wchar_t >::value ,const wchar_t* >::type
Dflt_Frmt() { return L"%i"; }
////////////////////////////////////////////////////////////////////////////////
template < typename T ,typename I >
inline
std::basic_string< T ,std::char_traits <T> >
to_string (I iNum ,const T* pszFrmt)
{
const int iLen (65);
T szBuff [iLen] = {0};
std::basic_string< T ,std::char_traits <T> > frmt ((pszFrmt && (*pszFrmt)) ? pszFrmt : Dflt_Frmt<T>());
str_printf(szBuff ,iLen ,frmt.c_str() ,iNum);
return szBuff;
}
////////////////////////////////////////////////////////////////////////////////
この私がやりたいものをこの(明らかにそれが働いていない)
私はsimillar方法でこれを行うことができますまたは作業バージョンが最善の方法ですか? またはこれを行う方法>
私は文字列ストリームを使用するための提案は必要ありません(これはこの質問に関するものではありません)。
MSVS 2010を使用しています(申し訳ありませんが、後押しはありません)。
ありがとうございます。
より良い仕様で始まり、いくつかのサンプルコードと望ましい出力(単体テストのスタイルで良いでしょう)。これにより、これらすべてのテンプレートのポイントを理解して、どこにでも出てくる呼び出しを増やすことがずっと簡単になります。 –