模板化类型的格式说明符

时间:2013-04-10 14:54:10

标签: c++ templates format-specifiers

我有一个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的格式说明符?

3 个答案:

答案 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";}
};

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