템플릿 프로그래밍 기술을 확장하려고하는데 적절한 해결책이없는 문제에 직면하고 있습니다. 이 템플릿은 좀 더 고급 템플릿 작업을 수행하기위한 개인 교육 실행 파일입니다.템플릿 프로그래밍에 대한 도움이 필요합니다.
목표 : 형식 문자열의 유형에 따라 모든 정수 유형 (sprintf 또는 swprintf 사용)을 문자열 또는 wstring으로 변환하기위한 템플릿을 작성하십시오. 오류 검사가 필요하지 않습니다 (현재는 현재 없음). 난 가변 형식의 문자 유형을 결정하기 위해 필요로하는 대 중 "%i"
또는 L"%i"
int로서 기본 리터럴 값을 제공 할 필요
(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;
}
////////////////////////////////////////////////////////////////////////////////
이이 나는
////////////////////////////////////////////////////////////////////////////////
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};
// declare a Variable of const T* and initialie it with "%i" or L"%i"
typename std::enable_if< std::is_same< T ,char >::value ,const char* >::type dft("%i");
typename std::enable_if< std::is_same< T ,wchar_t >::value ,const wchar_t* >::type dft (L"%i");
// doesn't work (error : type is not a member of std::enable_if<...> !
std::basic_string< T ,std::char_traits <T> > frmt ((pszFrmt && (*pszFrmt)) ? pszFrmt : dft);
str_printf(szBuff ,iLen ,frmt.c_str() ,iNum);
return szBuff;
}
////////////////////////////////////////////////////////////////////////////////
은 내가 simillar 방식으로이 작업을 수행 할 수 있습니다 (분명히이 일하는 아니에요) 할 싶은 것이 또는 작업 버전이 가장 좋은 방법입니까? 또는이 작업을 수행하는 방법>
문자열 스트림을 사용하기 위해 제안 할 필요가 없습니다 (이 질문에 대한 내용은 아닙니다).
MSVS 2010 사용 (부스트 없음).
감사합니다.
더 나은 사양으로 시작하면, 몇 가지 예제 코드와 원하는 출력 (단위 테스트 스타일에서 좋을 것입니다). 이렇게하면 이러한 모든 템플릿의 요점을 이해하는 것이 훨씬 쉬워 져서 당신이 여기 저기에 쏟아져 나오는 전화를 부추길 수 있습니다. –