Всех приветствую!
Приведу два примера, чтобы плавно подвести к вопросу.
ПРИМЕР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) {аналогично присваив. полям какие-то большие значения}
)
Или есть варианты лучше?
Заранее спасибо за внятные комментарии по существу вопроса.