Правильно ли я считаю, что эта функция должна оцениваться только во время компиляции, или это требует затрат времени выполнения?
template <typename T>
size_t constexpr CompID() {
return typeid(T).hash_code();
}
struct Foo {};
int main(int argc, const char * argv[]) {
size_t foo = CompID<Foo>();
return 0;
}
Функция constexpr позволяет оценивать функцию во время компиляции, но не требует этого, поэтому ваш ответ «возможно». Это зависит от настроек оптимизации компилятора.
§7.1.5 [dcl.constexpr] / 7
Вызов к
constexpr
Функция выдает тот же результат, что и вызов эквивалентногоconstexpr
функция
во всех отношениях, за исключением того, что вызовconstexpr
Функция может появляться в постоянном выражении.
Если вы хотите не иметь затрат времени выполнения, вы можете форсировать оценку времени компиляции, присвоив ее переменной constexpr, например,
constexpr auto foo = CompID<Foo>();
Также обратите внимание, что type_info.hash_code()
не может быть оценена во время компиляции (это не функция constexpr, §18.7.1 [type.info] / 7). Таким образом, ваш код на самом деле не так.
Других решений пока нет …