将课程传递给sprintf

时间:2013-10-08 07:25:16

标签: c++ printf variadic-functions

早上好。

我有一个类,技术上只是一个关于char数组的包装器。 它在构造时为字符串分配内存,并在它被破坏时释放它。那不是问题。

只要我想将它传递给任何vararg函数(例如sprintf),就会出现问题 我的编译器抛出一个错误,声明它无法复制non-trivial type

经过一次谷歌搜索,它告诉我,“普通类型”是任何类型,可以用memcpy复制,没有任何构造函数等。

现在我的问题:有没有办法让编译器只用编写变量来传递内部char字符串?

例如:

Wrapper Var("World");
sprintf(Buf, "Hello %s", Var);

在这次电话会议之后,它应该是'Hello World'。

如果我编写(并调用)任何访问内部流的函数(如c_str()),它就可以工作,但这并不完全是类的目的。 它应该是一个干净的API,它可以像常规字符串一样传递,只需要内存管理功能。

我试过了:

operator char *() {
    return InternalString;
}

但它似乎没有被sprintf调用。

非常感谢你的关注。

3 个答案:

答案 0 :(得分:2)

隐式转换运算符不适用于sprintf()之类的变量arg函数,因为编译器不知道对象需要转换为什么类型。因此,在这种情况下,您需要使用c_str()函数(或类似函数),或使用static_cast<char*>(Var)显式投射它。

答案 1 :(得分:1)

实际上,添加一个像'c_str()'这样的成员函数是最好的解决方案 或者您提供了将类型'wrapper'强制转换为char *

的方法

答案 2 :(得分:1)

您不能将非POD对象作为变量参数函数的参数传递。 尝试查看Boost格式,或使用C ++ 11编写自己的类型安全sprintf函数