1

我有一个以整数类型为模板的 C++ 类,例如,

template<typename int_type>

假设在那个类的某个地方,我想用来sscanf从文件中读取一些值,例如,

int_type num_rows;
fgets( buffer, BUFSIZE, in_file );
sscanf( buffer, "%d", &num_rows);

格式说明符仅在int_type是内在的 时才能正常工作int

有没有更好的方法来处理 general 的格式说明符int_type

4

3 回答 3

7

而不是使用sscanf()and 格式说明符使用std::istringstreamwith operator>>()

if (fgets( buffer, BUFSIZE, in_file ))
{
    std::istringstream in(buffer);
    if (!(in >> num_rows))
    {
        // Handle failure.
    }
}

替换(未显示)FILE*并用 astd::ifstream可以删除std::istringstream并直接从 the 中读取std::ifstream

于 2013-04-10T14:56:31.180 回答
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";
于 2013-04-10T15:28:18.697 回答
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";}
};

实际上,您可能希望使用流进行输入和输出

于 2013-04-10T14:57:32.603 回答