Я ищу способ автоматического определения уникального имени объекта/символа на основе типа, как показано в следующем примере, где MEMBER(TypeName)
- это что-то (макрос/whatever ...), который представляет/расширяется до уникального идентификатора объекта, идентификатор которого определяется от TypeName
.Как автоматически определить уникальный объект/имя символа на основе типа
class A { int i; };
class B { int i; };
class X
{
A MEMBER(A);
B MEMBER(B);
X()
{
MEMBER(A).i = 1;
MEMBER(B).i = 2;
}
};
Я первый попытался использовать следующий простой макрос, чтобы сделать это:
#define MEMBER(TypeName) m_ ## TypeName
, который прекрасно работает, до тех пор, как TypeName
не полное имя, такое как NameSpace::Type
; поэтому я все еще ищу решение, работающее с полностью квалифицированными именами типов.
Примечание1: синтаксис для определения и использования членов класса X
, описанных выше, предоставляется только для уточнения моих потребностей; решение может включать совершенно иной способ определения и использования членов.
Примечание2: члены класса X
не должны быть статическими.
Примечание3: доступ к членам класса X
должен быть быстрым; предпочтительным является решение времени компиляции.
Примечание4: класс X
не может содержать более одного элемента того же типа.
Спасибо за помощь.
как об использовании 'станд :: tuple'? если вы генерируете имена, основанные на типах, то это означает, что ваши члены класса имеют уникальные типы. Если это так, то' станд :: кортеж :: получить 'идеально подходит для вас. Макросов препроцессора следует избегать в C++, если он не может быть на C++. –
mariusm
@mariusm: Звучит как хорошее решение моей проблемы. Я попробую и отправлю отзыв. Пожалуйста, разместите свое решение в качестве ответа, чтобы он мог получать голоса. Спасибо за Ваш ответ. – shrike
@mariusm: после быстрого поиска std :: tuple может быть хорошим решением, если std :: tuple :: get разрешен во время компиляции (штраф за исполнение не будет приемлемым, если нет); можете ли вы сказать мне, разрешено ли это во время компиляции или нет? Благодарю. –
shrike