gpt4 book ai didi

c++ - 在 C++ 中获取变量地址的最可移植和可靠的方法

转载 作者:塔克拉玛干 更新时间:2023-11-02 23:29:28 25 4
gpt4 key购买 nike

使用 &如果变量类型已重载,获取变量地址可能会出现问题 operator&() .例如,_com_ptr_operator&()重载修改对象的副作用。

现在我有一组复杂的模板,其功能如下:

template<class T>
void process( const T* object )
{
//whatever
}

template<class T>
void tryProcess( T& object )
{
process( &object )
}

tryProcess()我需要一个 T*指针保存 T 类型的实际对象的地址.

tryProcess()的上述实现只有在 class T 时才能正常工作没有 operator&()重载。所以如果我调用tryProcess<_com_ptr_<Interface>>()我可以获得意想不到的结果 - 重载 operator&()被触发。

another question以下解决方法是 suggested :

template<class T>
T* getAddress( T& object )
{
return reinterpret_cast<T*>( &reinterpret_cast<char&>( object ) );
}

有了这样的功能我可以实现tryProcess()如下:

template<class T>
void tryProcess( T& object )
{
process( getAddress( object ) )
}

并且无论是否class T 都将始终获得相同的行为有operator&()重载。这在 Visual C++ 7 上通过优化引入了零开销 - 编译器获取要执行的操作并仅获取对象地址。

这个问题的解决方案的可移植性和标准兼容性如何?如何改进?

最佳答案

Boost addressof是通过 reinterpret_cast 技巧实现的,所以我想说它可能是可移植的并且符合标准。

Here你可以看到有问题的代码。

关于c++ - 在 C++ 中获取变量地址的最可移植和可靠的方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2333321/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com