2014-09-20 118 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