Я не уверен, что полностью понимаю ваш вопрос.Вы имеете в виду, что у вас есть универсальный макрос типа, который дается какой-то библиотекой, и вы хотите изменить его на свой собственный новый тип?
Что вы всегда можете сделать, это дать ему другое имя и использовать значение по умолчаниюcase для получения предоставленного поведения:
#define to_str2(X) _Generic((X), default: to_str(X), int: i_str(X))
Edit :
Это не будет работать идеально, потому что вам придется поместить оценку аргумента функции в _Generic
.В частности, это означает, что тип X
должен быть совместим со всеми ветвями вложенных обобщенных выражений.
Было бы проще, если бы в рассматриваемой библиотеке был макрос, который просто возвращал бы саму функцию,без (X)
, скажем to_strGen
, и это никогда не оценило бы X
.Тогда вы могли бы сделать
#define to_str2Gen(X) _Generic((X), default: to_strGen(X), int: i_str)
#define to_str2(X) to_str2Gen(X)(X)