Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/templates/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
模板参数的格式规范 我有一个C++类,它被模板化为整数类型;类似于 template<typename int_type> void myClass(int_type a) { // [...] }_C++_Templates_Format Specifiers - Fatal编程技术网

模板参数的格式规范 我有一个C++类,它被模板化为整数类型;类似于 template<typename int_type> void myClass(int_type a) { // [...] }

模板参数的格式规范 我有一个C++类,它被模板化为整数类型;类似于 template<typename int_type> void myClass(int_type a) { // [...] },c++,templates,format-specifiers,C++,Templates,Format Specifiers,但这似乎不是处理事情的最佳方式 还有其他建议吗?您可以使用一个类和专门化: template <typename T> struct scanf_format; template <> struct scanf_format<int> { static constexpr const char* format = "%d"; static constexpr const char* format2 = "%d %d"; }; templat

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


还有其他建议吗?

您可以使用一个类和专门化:

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

可能最好使用
运算符
sizeof(int)=sizeof(unsigned int)
的模板版本,但是
%d
不是
unsigned int
的正确格式说明符(例如,考虑
int\u MAX
UINT\u MAX
之间的数字)。要为不同类型提供不同的实现,函数重载通常是一种好方法。
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);
}
template <typename T>
void my_scanf2(const char* buffer, T&a, T&b)
{
    std::stringstream ss(buffer);
    ss >> a >> b;
}