Функция Constexpr в списке инициализатора конструктора constexpr

Я хотел бы инициализировать член структуры с помощью хэша имени структуры.

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;

Благодарю.

0

Решение

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;
};
4

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]