Всех приветствую!
Приведу два примера, чтобы плавно подвести к вопросу.
ПРИМЕР1
Допустим есть словарь DICTIONARY<const char*, int> (Хотя и пишу на C буду использовать удобную нотацию из шаблонов C++)
У него есть ф-ция
int dict_find_value(DICTIONARY *dict, const char* key);
она возвращает значение типа int по заданному ключу.
Но возм. две ситуации 1 - словарь еще пустой 2 - такой ключ не найден
Что будет возвр. эта ф-ция в этих двух случаях?
Можно завести
#define DICT_KEY_NOT_FOUND INT_MAX
#define DICT_EMPTY         INT_MIN
и возвращать их в этих случаях.
Тогда проверки будут выглядеть так
if (DICT_KEY_NOT_FOUND != dict_find_value(&dict, key) )
// что-то делаем
ПРИМЕР2
Есть словарь DICTIONARY<const char*, void*>
Так же есть аналогичная ф-ция поиска
void* dict_find_value(UDICTIONARY *dict, const char* key)
которая возвр. два спец. значения
extern void* UDICT_KEY_NOT_FOUND;
extern void* UDICT_EMPTY;
...
UDICTIONARY*  udict_create(const size_t capacity)
{
...
	static int udnotfound;
	static int udempty;
	if (!UDICT_KEY_NOT_FOUND) UDICT_KEY_NOT_FOUND=&udnotfound;
	if (!UDICT_EMPTY)         UDICT_EMPTY=&udempty;
...
}
которые инициализируются (вполне конкр. значениями) при создании словаря.
А теперь вопрос.
Теперь есть обобщенный словарь UDICTIONARY<const char*, TYPE>
Какой TYPE пока еще не известно (может один из простых или структура).
Так вот как для него изящно завести эти два спец. значения?
Что-то вроде такого?
#define UDICT_KEY_NOT_FOUND(x)\
  _Generic( (x),            \
     int           : INT_MAX,     \
     float         : FLT_MAX,  \
     double        : DBL_MAX,   \
     struct POINT2 : (POINT2){.X=FLT_MAX, .Y=FLT_MAX},          \
     struct TRIANGLE_INDEX: (TRIANGLE_INDEX){.part=INT_MAX, .I=INT_MAX, .J=INT_MAX, .K=INT_MAX} \
     struct TYPE : (TYPE) {аналогично присваив. полям какие-то большие значения}
)
Или есть варианты лучше?
Заранее спасибо за внятные комментарии по существу вопроса.

