2014-09-20 116 views
0

我有一個C++類模板化整數類型;沿模板參數的格式規範

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

線的東西我現在想從一個文件sscanf()數據讀入int_type類型的變量。爲此,我必須指定格式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

那麼可以使用'operator <<()'的模板版本,然後使用'std :: istringstream'而不是'sscanf()'。 – 2014-09-20 09:20:57

+5

'sizeof(int)== sizeof(unsigned int)',但'%d'不是'unsigned int'的正確格式說明符(例如,想想'INT_MAX'和'UINT_MAX'之間的數字)。爲了爲不同類型提供不同的實現,*函數重載*通常是一種好方法。 – dyp 2014-09-20 09:25:07

回答

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