Как преобразовать макросы C++ в typedefs?

Есть ли typedef эквивалент:

#define HashTabOf(i)    htab[i]

и

#define MAXCODE(n_bits) (((code_int) 1 << (n_bits)) - 1)

?

Код находится в процессе переноса с C на C++.


person Daniel Del Core    schedule 21.04.2012    source источник
comment
Ни один из них не определяет тип, так зачем им typedef?   -  person Oliver Charlesworth    schedule 21.04.2012
comment
я не уверен :( я действительно запутался. было бы лучше преобразовать их в функцию? или это совершенно неправильно?   -  person Daniel Del Core    schedule 21.04.2012
comment
Функция полностью правильная.   -  person juanchopanza    schedule 21.04.2012


Ответы (2)


Не typedef, а способ С++:

template <typename T>
inline T &HashTabOf(size_t i)
{
    return htab[i];
}

и

inline size_t MAXCODE(size_t n_bits)
{
    return (1 << n_bits) - 1;
}
person Dani    schedule 21.04.2012
comment
Хорошо, похоже, это не сработало. Я не вслух использую шаблоны в этой задаче, но есть ли функция, на которую я могу заменить - person Daniel Del Core; 21.04.2012
comment
Первый может раздражать, потому что компилятор не может автоматически вывести аргумент шаблона. - person Oliver Charlesworth; 21.04.2012
comment
@OliCharlesworth: Вот почему я предложил другое решение. С++11 великолепен. - person Nawaz; 21.04.2012
comment
Зачем тебе template здесь? decltype(htab[i]) одинаково для любого действительного индекса i. - person 5gon12eder; 29.11.2015

Я бы реализовал шаблонное решение @Dani как:

inline auto & HashTabOf(size_t i) -> decltype(htab[0])
{
    return htab[i];
}

Он действителен только в C++11. Он использует функцию под названием trailing-return-type, представленную C+. +11.

Преимущество этого решения в том, что это больше не шаблон. Вам не нужно упоминать T при его использовании, в то время как в решении @Dani вы также должны упомянуть T:

auto item = HashTabOf<Type>(4); //Dani's solution 
auto item = HashTabOf(4);       //My solution

И да, вы можете просто написать это:

inline int & HashofTable(size_t i)
{ 
   return htab[i]; 
}

Кроме того, почему бы вам не использовать htab[i] напрямую?

person Nawaz    schedule 21.04.2012
comment
извините, ребята, но этот шаблон не работает для меня. есть ли простой способ сделать это, я надеялся получить больше... int HashofTable(i){ return htab[i]; } - person Daniel Del Core; 21.04.2012
comment
@DanielDC: Если вам не разрешено использовать шаблон, это одно, но сказать, что эти шаблоны не работают, — это другое. Кроме того, это решение НЕ использует шаблон. Это не шаблонное решение. - person Nawaz; 21.04.2012
comment
Я действительно не знаю, что такое шаблоны на данный момент, так что не принимайте это близко к сердцу. - person Daniel Del Core; 21.04.2012