Ich suche nach einer Möglichkeit, bestimmte überlastete GCC-Einbauten in C++ zu simulieren. Die Einbauten sind ähnlich wie diese:Funktion, die nur Literal Ganzzahlen
__builtin_foo(char *a, signed int b);
__builtin_foo(short *a, signed int b);
__builtin_foo(long *a, signed int b);
Mit einer speziellen Einschränkung schwer in GCC codiert: b
eine wörtliche Wert sein muss, dh Sie können auch anrufen:
__builtin_foo((char *)0, 1);
aber nicht:
extern int val;
__builtin_foo((char *)0, val);
, die einen Compilerfehler generiert. Ich habe mit std::enable_if
fiedled, um dies zu simulieren, kann aber keine Möglichkeit finden, zu erzwingen, dass nur wörtliche Argumente akzeptiert werden. Gibt es eine Möglichkeit, dies zu tun?
#define ASSERT_LITERAL (x) (void) (x ## 98765L) - bewirkt, dass ein Übersetzungsfehler für alle nicht Ganzzahlliteral z.B. ASSERT_LITERAL (x); - fehlgeschlagen ASSERT_LITERAL (1); - bestehen. Zu hacky, um als Antwort hinzuzufügen – samgak
@samgak: Es ist auch zu hacky zu arbeiten. 'ASSERT_LITERAL (0)' wird ebenfalls fehlschlagen. –
@MikeSeymour: Kleinere Details; 'x ## 010L' behebt das. Aber ich bin mir weniger sicher über 'ASSERT_LITERAL (0.0)' – MSalters