C ++ Type Wrapper printf为float打印错误的值

时间:2015-03-10 10:14:07

标签: c++ types printf wrapper typecasting-operator

我试图为基本类型编写一个包装类,但在使用printf时遇到了问题。

由于某种原因,printf使用int但不使用float。 然而,std :: cout可以很好地工作。

当我明确地转换为float时,

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?

为什么它不适用于浮动?

如果没有明确的演员,我怎样才能让它正常工作?

1 个答案:

答案 0 :(得分:1)

  

为什么它适用于int?

是UB。在您的特定机器上,它恰好工作。

  

为什么它不适用于浮动?

出于与上述相同的原因。

  

如果没有明确的演员,我怎样才能让它正常工作?

直截了当,你做不到。 printf是为C创建的,当时C ++还没有(并且在printf的设计中不考虑OOP)。因此,无法为新类型扩展printf。

您可以创建一个包装函数,对printf(显式)支持的类型进行转换,并在内部调用printf。这很麻烦,容易出错等等。

这是c ++ iostream对[s | f] printf系列函数的主要优势之一。