将类作为参数传递给printf()时要重载的运算符

时间:2015-12-03 11:17:54

标签: c++

我有一个int,我将其封装为'属性'在这里使用模板解决方案:

https://stackoverflow.com/a/4225302/3717478

template<typename T>
class Property
{
protected:
    T& _value;

public:
    Property(T& value) : _value(value)
    {
    }   // eo ctor

    Property<T>& operator = (const T& val)
    {
        _value = val;
        return *this;
    };  // eo operator =

    operator const T&() const
    {
        return _value;
    };  // eo operator ()

    T& operator() ()
    {
        return _value;
    }
    T const& operator() () const
    {
        return _value;
    }
};

但是,如果属性标识符作为参数传递给期望可变数量参数的函数,例如printf(),则传递类指针值而不是int值。

是否有一个我可以重载的运算符,以便传递int值?

3 个答案:

答案 0 :(得分:2)

没有。从技术上讲,编译器不知道需要哪种类型。 (请注意,一些编译器提供警告,因为他们知道格式字符串的语法并且可以检查参数,但据我所知,这不是强制性的,也没有定义实际的参数类型。)所以没有办法编译器在搜索强制转换操作符时知道它需要查找的类型。

你需要明确施放。在你的情况下,你可以:

int a;
Property<int> prop(a);
a = 10;
printf("%d\n", static_cast<int>(prop));

答案 1 :(得分:2)

您可以将static_cast运算符与该类的对象一起使用。

例如

int value = 10;
Property<int> p( value );

printf( "%d\n", static_cast<int>( p ) );

在这种情况下,转换运算符

operator const T&() const
{
    return _value;
};  // eo operator ()

将被召唤。

答案 2 :(得分:2)

在将班级的对象传递给printf之前,您必须自己执行转换。将大多数用户定义类型的对象传递给varargs函数具有实现定义的行为:

[expr.call] / 7:

  

传递具有非类的类型(第9条)的潜在评估参数   普通的复制构造函数,一个非平凡的移动构造函数,或一个非平凡的析构函数,没有相应的   参数,由实现定义的语义有条件地支持