C++ Type Wrapper printf 打印错误的浮点值
C++ Type Wrapper printf prints wrong value for float
我尝试为基本类型编写一个包装器 class,但是 运行 在使用 printf 时遇到了问题。
出于某种原因,printf 可用于 int 而不是 float。
std::cout 但是两者都可以正常工作。
当我显式转换为浮动时,printf 当然可以正常工作。
template <typename T>
class Type
{
public:
Type() : _mData() {}
Type(const T& _data) : _mData(_data) {}
operator T() const { return _mData; }
operator std::string() const { return std::to_string(_mData); }
private:
T _mData;
};
int main(void)
{
Type<int> someInt(200);
std::cout << "int" << std::endl;
std::cout << "std::cout: " << someInt <<std::endl;
printf("printf: %d\n\n", someInt);
Type<float> someFloat(300.3);
std::cout << "float" << std::endl;
std::cout << "std::cout: " << someFloat <<std::endl;
printf("printf: %f\n\n", someFloat);
return 0;
}
output:
int
std::cout: 200
printf: 200
float
std::cout: 300.3
printf: 0.000000
为什么它与 int 一起工作?
为什么它不适用于浮动?
如何在不进行显式转换的情况下使其正常工作?
Why does it work with int?
是UB。在您的特定机器上,它恰好可以工作。
Why does it not work with float?
同上原因
How can i get it to work properly without explicit casting?
直接地,你不能。 printf 是为 C 创建的,当时 C++ 还不存在(在 printf 的设计中没有考虑 OOP)。因此,无法为新类型扩展 printf。
您可以创建一个包装函数,该函数对 printf 支持的类型(显式)进行转换并在内部调用 printf。这样比较麻烦,容易出错等等。
这是 c++ iostream 相对于 [s|f]printf 函数系列的主要优势之一。
我尝试为基本类型编写一个包装器 class,但是 运行 在使用 printf 时遇到了问题。
出于某种原因,printf 可用于 int 而不是 float。 std::cout 但是两者都可以正常工作。
当我显式转换为浮动时,printf 当然可以正常工作。
template <typename T>
class Type
{
public:
Type() : _mData() {}
Type(const T& _data) : _mData(_data) {}
operator T() const { return _mData; }
operator std::string() const { return std::to_string(_mData); }
private:
T _mData;
};
int main(void)
{
Type<int> someInt(200);
std::cout << "int" << std::endl;
std::cout << "std::cout: " << someInt <<std::endl;
printf("printf: %d\n\n", someInt);
Type<float> someFloat(300.3);
std::cout << "float" << std::endl;
std::cout << "std::cout: " << someFloat <<std::endl;
printf("printf: %f\n\n", someFloat);
return 0;
}
output:
int
std::cout: 200
printf: 200
float
std::cout: 300.3
printf: 0.000000
为什么它与 int 一起工作?
为什么它不适用于浮动?
如何在不进行显式转换的情况下使其正常工作?
Why does it work with int?
是UB。在您的特定机器上,它恰好可以工作。
Why does it not work with float?
同上原因
How can i get it to work properly without explicit casting?
直接地,你不能。 printf 是为 C 创建的,当时 C++ 还不存在(在 printf 的设计中没有考虑 OOP)。因此,无法为新类型扩展 printf。
您可以创建一个包装函数,该函数对 printf 支持的类型(显式)进行转换并在内部调用 printf。这样比较麻烦,容易出错等等。
这是 c++ iostream 相对于 [s|f]printf 函数系列的主要优势之一。