使用类型转换运算符

时间:2011-03-11 15:54:01

标签: c++ type-conversion

我有一个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

2 个答案:

答案 0 :(得分:3)

除转换运算符外,只需重载operator->

MIB_IPFORWARDTABLE* operator-> () { ... }
const MIB_IPFORWARDTABLE* operator-> () const { ... }

答案 1 :(得分:0)

您可以重载operator->但请在执行此操作之前仔细考虑。通常,以不具有完全透明性的方式重载运算符将导致将来出现维护问题。您是否考虑过在课堂上添加“get_entries”功能?