2011-03-11 5 views
2

У меня есть 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

ответ

3

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

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

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

Смежные вопросы