unsigned char *check = NULL;
check = (dynamic_cast<unsigned char *>( ns3::NetDevice::GetChannel() ));
这就是我想要的。但错误是:
error: cannot dynamic_cast ‘ns3::NetDevice::GetChannel() const()’ (of type ‘class ns3::Ptr<ns3::Channel>’) to type ‘unsigned char*’ (target is not pointer or reference to class)
我也尝试过:
reinterpret_cast
但它根本不起作用。
答案 0 :(得分:1)
ns3::NetDevice::GetChannel()
的返回类型是某种自定义智能指针;在没有看到它的定义的情况下,我们只能猜测如何将其转换为原始指针。
也许它实现了一个转换运算符operator T*()
,虽然这通常被认为是一个坏主意,因为它使意外的转换太容易被偶然发生。在这种情况下,您可以这样做:
void * check = ns3::NetDevice::GetChannel();
否则,它可能有一个转换为原始指针的成员函数。标准智能指针通常称为get()
:
void * check = ns3::NetDevice::GetChannel().get();
如果它没有提供,并且你确实想要获得一个原始指针,那么你可以取消引用它并获取指向解除引用对象的指针(假设它支持退化;否则,调用它有点奇怪一个指针):
void * check = &*ns3::NetDevice::GetChannel();
获得void *
后,您可以使用static_cast
将其更改为unsigned char *
,如果这是您想要的。小心你用它做什么,因为弄乱对象的字节很容易导致不确定的行为。
更新:如果ns3::Ptr
是记录的模板here,那么您可以使用以下命令获取原始指针:
void * check = PeekPointer(ns3::NetDevice::GetChannel());
答案 1 :(得分:0)
最好使用两个static_cast
代替reiterpret_cast
。因为标准不保证不同的指针具有相同的大小。但是,该标准确保void*
具有足够的大小以适合指向任何数据类型的指针(指向函数的指针除外)。
unsigned char *check = NULL;
check = static_cast<unsigned char*>(static_cast<void*>(ns3::NetDevice::GetChannel()));
您的Ptr<Channel>
必须重载运算符,它返回保持指针:
template<typename T>
class Ptr
{
public:
operator T*() {return _p;}
private:
T* _p;
};