2010-11-25 14 views
0

Comment définir une macro (ce Q est en quelque sorte lié à this Q et à la réponse de CashCow) qui va se développer en un entier différent si cette macro est utilisée sur une autre ligne de code?
Je voudrais être capable de taper:Écriture d'une macro

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

après cette définition. Je voudrais que _0 et _1 soient de types différents.

+0

ce qui ne va pas avec '__LINE__' mentionné dans cette question? – kichik

+0

@kichik le problème avec __LINE__ est qu'il est indiqué explicitement et selon CashCow il n'est pas nécessaire si une macro est utilisée. –

+0

@robert ok Je vais mettre à jour mon Q –

Répondre

1

vous pouvez utiliser quelque chose comme ceci:

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

ou si vous faites seulement cela pour un type savoir:

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

Je suggère d'utiliser __COUNTER__ au lieu de __LINE__ cependant, il permet le type à être globalement unique, non seulement unique à la ligne.

EDIT: relisez la question, qu'entendez-vous exactement par "nombre entier différent"? comme dans un type différent ou une valeur d'initialisation différente?

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

    operator T() 
    { 
     return Value; 
    } 
}; 

#define VI(x) Integer<__COUNTER__> x 

ou (ce qui semble être celui que vous voulez)

#define I(x) int x(__COUNTER__) 
+0

@Necrolis merci pour ce __COUNTER__ il est plus sûr que __LINE__ –

+0

@There, @Necrolis '__COUNTER__' n'est pas standard, alors que' __LINE__' est –

+0

@Armen: à partir de GCC 4.3 son supporté , et MSVC était le compilateur l'introduisant, qui couvre beaucoup de terrain, donc c'est presque standard: P – Necrolis

2

Ce n'est pas exactement ce que vous voulez, mais c'est assez proche.

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

X(1) _0; 
X(1) _1; // different type than previous line