Я хотел бы инициализировать член структуры с помощью хэша имени структуры.
constexpr uint32_t myHash(const char* const data)
{ //Some code for hash
return myHash;
}
struct My_Struct{
constexpr Test() : ID(myHash("My_Struct"))
{
}
const uint32_t ID;
}
Когда у меня есть:
constexpr My_Struct my_constexpr_struct;
Затем хэш вычисляется во время компиляции успешно. Тем не менее, когда у меня есть в моей основной функции
My_Struct my_normal_struct;
тогда это назовет
constexpr uint32_t myHash(const char* const data)
функция в коде вместо простой инициализации члена структуры с константой времени компиляции.
Это, очевидно, повлечет за собой значительное снижение производительности, которого можно избежать.
Любые мысли или предложения о том, как заставить компилятор выполнить это во время компиляции? Я действительно не хочу делать:
constexpr uint32_t MY_STRUCT_ID = myHash("My_Struct");
struct My_Struct{
constexpr Test() : ID(MY_STRUCT_ID)
{
}
const uint32_t ID;
Благодарю.
constexpr
это запрос, а не требование. Таким образом, если вы инициализируете объект вне контекста константного выражения, даже через constexpr
конструктор, нет никакой гарантии, что инициализация будет выполнена во время компиляции.
Если вы хотите гарантировать оценку во время компиляции, вы иметь позвонить constexpr
функционировать в контексте постоянного выражения. Если явное использование переменной каким-то образом оскорбляет вас, вы всегда можете заставить constexpr
оценка с использованием шаблона:
template<typename T, T t>
struct repeat
{
using value_type = T;
static constexpr T value = t;
constexpr T operator()() const noexcept {return t;}
};
struct My_Struct{
constexpr My_Struct() : ID(repeat<uint32_t, myHash("My_Struct")>::value)
{
}
const uint32_t ID;
};
Других решений пока нет …