У меня есть API, который должен быть максимально простым. В то же время строки некоторых функций «хорошо известны», поэтому всегда являются строковыми литералами и поэтому могут быть преобразованы в значения CRC32 во время компиляции, например, так:
function(crc32("text"), ...);
Контрольная сумма происходит в время компиляции с использованием constexpr.
Я хочу упростить этот API, чтобы люди, с которыми я работаю, не знали этих бессмысленных деталей. Я хочу, чтобы контрольная сумма во время компиляции происходила внутри функции, например:
function("text", ...);
Выполнение контрольной суммы внутри встроенной функции не работает, поскольку аргумент функции больше не является constexpr. Следующий код не удастся скомпилировать:
inline void function (const char* text, ...) {
constexpr uint32_t hash = crc32(text); // does not work
}
Это для эмулируемой среды, поэтому важно, чтобы контрольная сумма происходила во время компиляции. Есть несколько функций, которые работают таким образом, и все они выиграют от упрощения API.
Какие варианты у меня есть, чтобы скрыть тот факт, что вы должны помнить, чтобы использовать вызов к crc32?
Используя идею rustyx, я сделал это:
struct AutoCRC {
constexpr AutoCRC(const char* str) : hash{crc32(str)} {}
constexpr AutoCRC(const uint32_t h) : hash{h} {}
const uint32_t hash;
};
Но это не сработало. По сравнению с использованием constexpr CRC32 ha sh непосредственно это почти удвоило размер двоичного файла: 1488 -> 2696.