2013-01-05 44 views
0

我希望能够做到这在C++标准的编译器:C++重写地址操作

void DoSomething(Object* object) { } 

DoSomething(&Object()) 

具有默认地址操作,它会为该构造对象保存到一个寄存器,然后将其覆盖在DoSomething()...对于所有对象在一行中执行此操作真的很好(除了不能覆盖它们的基本类型)。

因此,这里是我有:

class Object 
{ 
    public: 
     Object* operator&(Object object) { return &object; } 
}; 

这显然只是不能够指定我想基本&运营商,而不是被覆盖的一个重复循环。当我打电话给DoSomething时(& Object()),它也不会被调用。这可能吗?它会使复杂类型的初始化更容易,所以它很重要。

+2

这将是一件非常残酷的事情!为什么它会让事情变得更简单? –

+2

这不会将地址返回给临时吗? Sehr不好。 –

+0

是的,我猜这不会改变什么,仍然是暂时的。哦,我猜想在堆栈上初始化一个复杂的对象结构会很痛苦,然后 –

回答

4

你可以像在C++ 11:

class Object 
{ 
    public: 
}; 

Object* operator&(Object&& object) { return std::addressof(object); } 
Object const* operator&(Object const&& object) { return std::addressof(object); } 

所有对象:

template<typename T> 
T* operator&(T&& x) { 
    return std::addressof(x); 
} 

请不要这样做,但。人们会恨你。

+0

@ K-ballo固定我想。常量值引用使我娇气。 – Pubby

+0

我真正想要做的是强制将寄存器值保存到堆栈,如果它被传递给一个函数。听起来不像是可能的 –

0

人们通常不会那样做C++。有办法做到这一点,但只是要求麻烦。相反,C++解决方案会做:

void DoSomething(Object const& object){ ... } 

但也许你会需要能够对非const对象以及操作。在这种情况下,您应该这样做:

void DoSomething(Object& object){ ... } // operate on an lvalue, object with a name 
void DoSomething(Object&& object){ ... } // operate on an rvalue, either temporary or moved object 

根据您实际尝试的方法,解决方案会有很大的不同。

+0

显然,他发现打字“const”太麻烦了。看到他最后的评论[这里](http://stackoverflow.com/a/14169973/440119)。 –

+0

嗯,这是多余的,并防止你想改变它的情况。不,如果可以避免,我不会强制每个人都添加'const'。 –

+1

@Ryan Brown:你似乎决心违背语言,即使当语言已经有了一个构造来捕捉和修改临时对象时......我会说你只是选错语言 –