2010-11-25 2 views
0

Как определить макрос (это Q как-то связано с this Q и ответом CashCow), который будет расширяться до другого целого, если этот макрос используется в другой строке кода?
Я хотел бы иметь возможность ввести:Написание макроса

X<1> _0; 
X<1> _1; 

после такого опр. Я хотел бы, чтобы _0 и _1 были разных типов.

+0

, что случилось с `__LINE__` упоминается в этом вопросе? – kichik 2010-11-25 12:14:45

+0

@kichik Проблема с __LINE__ заключается в том, что она явно указана и в соответствии с CashCow ей не нужно, если используется макрос. – 2010-11-25 12:15:52

ответ

1

вы можете использовать что-то вроде этого:

#define var(T,...) T<__VA_ARGS__,__LINE__> 

или если ваш только делает это для одного знать тип:

#define var(x) T<(x),__LINE__> 

Я предлагаю использовать __COUNTER__ вместо __LINE__ однако, это позволяет тип, который будет глобальным уникальным, а не только уникальным для линии.

EDIT: перечитайте вопрос, что именно вы подразумеваете под «другим целым числом»? как в другом типе или другом значении инициализации?

template<typename T = int, const T nValue> class Integer 
{ 
    T Value; 
    Integer() : Value(nValue) 
    { 
    } 

    operator T() 
    { 
     return Value; 
    } 
}; 

#define VI(x) Integer<__COUNTER__> x 

или (Это, кажется, один вы хотите)

#define I(x) int x(__COUNTER__) 
2

Это не совсем то, что вы хотите, но это довольно близко.

#define X(arg) Y<(arg), __LINE__> 

X(1) _0; 
X(1) _1; // different type than previous line 
Смежные вопросы