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 函数系列的主要优势之一。