c++ - 模板参数的格式规范

标签 c++ templates format-specifiers

我有一个以整数类型为模板的 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);

但这似乎不是处理事情的最佳方式。

还有什么建议吗?

最佳答案

你可以使用类和特化:

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

关于c++ - 模板参数的格式规范,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25947231/

相关文章:

c++ - 仅在(互斥)requires-clauses : legal or an ODR-violation? 中通过差异重载隐藏的 friend

c++ - C++11 可变参数模板中的 va_arg() 是什么?

c++ - dynamic_cast 是如何实现的

c++ - 快板 5 中的抗锯齿

c++ - SolvePNP 一段时间后返回错误的 rvec 和 tvec

c - 使用不同的格式说明符更快的输出

c - fscanf 格式说明符到结构

c++ - 为什么 C++ 允许返回对私有(private)成员的引用

c++ - 没有STL和动态内存分配的成员函数类

c - 如何在 if 语句中指定单引号?