我有一个C ++类,它是在整数类型上模板化的,例如,
template<typename int_type>
假设在该类的某个地方,我想使用sscanf
来读取文件中的某些值,例如,
int_type num_rows;
fgets( buffer, BUFSIZE, in_file );
sscanf( buffer, "%d", &num_rows);
如果int_type
是内在int
,格式说明符才能正常工作。
是否有更好的方法来处理常规int_type
的格式说明符?
答案 0 :(得分:7)
而不是使用sscanf()
和格式说明符而不是std::istringstream
使用operator>>()
:
if (fgets( buffer, BUFSIZE, in_file ))
{
std::istringstream in(buffer);
if (!(in >> num_rows))
{
// Handle failure.
}
}
替换(未显示)FILE*
和std::ifstream
可以删除std::istringstream
,而只需直接从std::ifstream
阅读。
答案 1 :(得分:3)
您可以在类中声明fmt
,并在实现中为每种类型提供显式值:
// foo.hpp
template< typename T >
class foo
{
private:
static const char* fmt;
public:
void print() const
{
T num_rows;
fgets( buffer, BUFSIZE, in_file );
sscanf( buffer, fmt, &num_rows);
}
};
和
// foo.cpp
template<> const char* foo< int >::fmt = "%d";
template<> const char* foo< long >::fmt = "%ld";
答案 2 :(得分:0)
您可以创建模板助手类:
template<class int_type>
struct fmt_helper_f{};
template<>
struct fmt_helper_f<int>
{
static const char * fmt() {return "%d";}
};
template<>
struct fmt_helper_f<float>
{
static const char * fmt() {return "%f";}
};
实际上,您可能希望使用流进行输入和输出