C ++: возможно ли написать код для игнорирования константного присваивания? - PullRequest
0 голосов
/ 19 мая 2018

Я пишу макросы для уменьшения кодирования в платформе и сталкиваюсь с проблемой, когда пользователи имеют возможность ввести квалификатор const.Проблема в том, что позднее макрос может попытаться присвоить значение значению.Если параметр является константой, я бы хотел, чтобы присвоение просто игнорировалось.

Простой макрос ниже демонстрирует, с чем я сталкиваюсь:

#define DECLARE_AND_ASSIGN(type, param, init_val, later_val) \
type param = init_val; \
param = later_val;

Ниже отлично работает:

DECLARE_AND_ASSIGN( int, foo, 0, 42 )

Но это, очевидно, не скомпилируется, потому что const назначается после инициализации:

DECLARE_AND_ASSIGN( const int, bar, 0, 42 )

Есть ли способ кодировать макрос, чтобы компилятор игнорировал значения const, являющиесяназначены?(Кодирование на C ++ на VS2017)

1 Ответ

0 голосов
/ 19 мая 2018

Вы можете обернуть назначение помощником следующим образом:

template <class T, class A>
void assignNonConst(T &v, A &&a)
{
  v = std::forward<A>(a);
}

template <class T, class A>
void assignNonConst(const T&, A&&)
{}

#define DECLARE_AND_ASSIGN(type, param, init_val, later_val) \
type param = init_val; \
assignNonConst(param, later_val);

Таким образом, когда param имеет тип не const, вызывается первая перегрузка шаблона и происходит назначение.Когда param равно const, выбирается вторая перегрузка, и ничего не делается.

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