我有一个visual studio 2008 C ++应用程序,我需要从一个带有可变大小缓冲区的函数中获取信息。所以,我有一个用std::vector
支持该类型的类,并将转换运算符实现为我想要的类型。
class CMibIpForwardTable
{
public:
operator MIB_IPFORWARDTABLE* ()
{
return reinterpret_cast< MIB_IPFORWARDTABLE* >( &buffer_.front() );
}
ULONG size() const
{
return buffer_.size();
}
void resize( ULONG size )
{
buffer_.resize( size );
}
private:
std::vector< BYTE > buffer_;
};
CMibIpForwardTable Get( DWORD* error_code = NULL )
{
CMibIpForwardTable table;
ULONG size = 0;
DWORD ec = ::GetIpForwardTable( NULL, &size, FALSE );
if( ec == ERROR_INSUFFICIENT_BUFFER )
{
table.resize( size );
ec = ::GetIpForwardTable( table, &size, TRUE );
}
if( NULL != error_code && ec != 0 )
*error_code = ec;
return table;
}
我希望能够像这样使用它:
CMibIpForwardTable table = Get();
// error: 'dwNumEntries' : is not a member of 'CMibIpForwardTable'
DWORD entries = table->dwNumEntries;
是否有一种很好的方式可以访问基础类型MIB_IPFORWARDTABLE
?或者我坚持做这样的事情:
MIB_IPFORWARDTABLE* t = table;
DWORD entries = t->dwNumEntries;
谢谢, PaulH
答案 0 :(得分:3)
除转换运算符外,只需重载operator->
。
MIB_IPFORWARDTABLE* operator-> () { ... }
const MIB_IPFORWARDTABLE* operator-> () const { ... }
答案 1 :(得分:0)
您可以重载operator->
但请在执行此操作之前仔细考虑。通常,以不具有完全透明性的方式重载运算符将导致将来出现维护问题。您是否考虑过在课堂上添加“get_entries”功能?