我试图为基本类型编写一个包装类,但在使用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?
为什么它不适用于浮动?
如果没有明确的演员,我怎样才能让它正常工作?
答案 0 :(得分:1)
为什么它适用于int?
是UB。在您的特定机器上,它恰好工作。
为什么它不适用于浮动?
出于与上述相同的原因。
如果没有明确的演员,我怎样才能让它正常工作?
直截了当,你做不到。 printf是为C创建的,当时C ++还没有(并且在printf的设计中不考虑OOP)。因此,无法为新类型扩展printf。
您可以创建一个包装函数,对printf(显式)支持的类型进行转换,并在内部调用printf。这很麻烦,容易出错等等。
这是c ++ iostream对[s | f] printf系列函数的主要优势之一。