2014-09-20 2 views
0

정수 유형에 템플릿 화 된 C++ 클래스가 있습니다. 지금 sscanf()와 유형 int_type의 변수로 파일에서 데이터를 읽고 싶습니다템플릿 매개 변수에 대한 형식 지정

template<typename int_type> 
void myClass(int_type a) { 
// [...] 
} 

의 라인을 따라 뭔가. 이를 위해 형식int_type으로 지정해야합니다. 지금까지 저는

if(sizeof(int) == sizeof(int_type)) 
    sscanf(buffer, "%d %d", &i, &j); 
else if(sizeof(long long) == sizeof(int_type)) 
    sscanf(buffer, "%lld %lld", &i, &j); 
else 
    assert(false); 

과 같은 작업을하고 있었지만이 작업을 처리하는 가장 좋은 방법은 아닙니다.

다른 제안 사항이 있으십니까?

당신은 클래스와 전문화 사용할 수 있습니다
+8

'sscanf()'보다는'std :: istringstream'에 바인드 된'operator <<()'의 템플릿 버전을 사용하는 것이 더 낫습니다. –

+5

'sizeof (int) == sizeof (unsigned int)',하지만'% d '은'unsigned int'에 대한 올바른 형식 지정자가 아닙니다 (예를 들어'INT_MAX'와'UINT_MAX' 사이의 수를 생각하십시오). 여러 유형에 대해 다른 구현을 제공하려면 * 함수 오버로드 *가 일반적으로 좋은 방법입니다. – dyp

답변

1

: 다음

template <typename T> struct scanf_format; 

template <> struct scanf_format<int> 
{ 
    static constexpr const char* format = "%d"; 
    static constexpr const char* format2 = "%d %d"; 
}; 

template <> struct scanf_format<long long> 
{ 
    static constexpr const char* format = "%lld"; 
    static constexpr const char* format2 = "%lld %lld"; 
}; 

template <typename T> 
void my_scanf(const char* buffer, T&a, T&b) 
{ 
    sscanf(buffer, scanf_format<T>::format2, &a, &b); 
} 

처럼 사용하지만 간단한 방법을 사용하는 것 operator >>

template <typename T> 
void my_scanf2(const char* buffer, T&a, T&b) 
{ 
    std::stringstream ss(buffer); 
    ss >> a >> b; 
} 

Live example

관련 문제