Программирование игр, создание игрового движка, OpenGL, DirectX, физика, форум
GameDev.ru / Программирование / Форум / [C++][РЕШЕНО] Универсальный макорос для вычисления количества элементов в переменной?

[C++][РЕШЕНО] Универсальный макорос для вычисления количества элементов в переменной?

КлапауцийЗабаненwww9 авг. 201823:48#0
Есть задача объединить два макроса в один.
Макросы такие:
#define GETPARAM_VAL(V)   getparam    (#V, V, __FILE__, __LINE__)
#define GETPARAM_ARR(V)\
    getparam(#V, V, __FILE__, __LINE__, SIZEARR(V));
где:
#define SIZEARR(_V) sizeof(_V)/sizeof(_V[0])

getparam(...) перегруженная шаблонная функция принимающая в аргументе все, что угодно из перечня нужного.

Проблема в том, что sizeof(_V[0]) на простых переменных выдает ошибку компиляции(и слава году).
А хотца чтобы ваще было на все про всё один макрос:

GETPARAM(V)
принимающий и массивы и простые переменные.

Можно ли обойти или убрать эту проблему?
Есть ли какое-нибудь решение, но не в сторону усложнения самого интерфейса или упращения требований к функциональной части?

TryПостоялецwww10 авг. 20180:03#1
> принимающий и массивы и простые переменные.
> Можно ли обойти или убрать эту проблему?
Написать больше шаблонов :)
template<class T>
size_t sizeArr(T&){
  return 1;
  }

template<class T,size_t count>
size_t sizeArr(T (&)[count]){
  return count;
  }
КлапауцийЗабаненwww10 авг. 20181:24#2
Try
спасибо!
все работает)
SuslikМодераторwww10 авг. 20185:37#3
заниматься метапрограммированием на шаблонах, но иногда при случае пользоваться макросами — это примерно как заниматься микроэлектроникой, но иногда при случае пользоваться кувалдой.
КлапауцийЗабаненwww10 авг. 201810:09#4
Suslik
ок,
тогда такой вопрос:
Как избегая макросов передать имя идентификатора в качестве строкового аргумента.
Т.е. заменить такое:
#define SHOW(V) show(#V)

где

void show(const char*);

на что-нить шаблонное?

DelfigamerПостоялецwww10 авг. 201811:12#5
Клапауций
Никак. В кресты никакой рефлексии так и не завезли. :(

/ Форум / Программирование игр / Общее

2001—2018 © GameDev.ru — Разработка игр