Использование оператора преобразования типов - PullRequest
2 голосов
/ 11 марта 2011

У меня есть приложение 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 ]

3 голосов
/ 11 марта 2011

Просто перегруз operator-> в дополнение к оператору преобразования.

MIB_IPFORWARDTABLE* operator-> () { ... }
const MIB_IPFORWARDTABLE* operator-> () const { ... }
0 голосов
/ 11 марта 2011

Вы можете перегрузить operator->, но, пожалуйста, очень внимательно подумайте, прежде чем сделать это. В целом, перегрузка операторов способом, который не имеет полной прозрачности, может вызвать проблемы с обслуживанием в будущем. Рассматривали ли вы просто добавление функции "get_entries" в свой класс?

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...