Я пишу программу моделирования физики, и я хочу сделать следующее: у меня есть адаптированная структура hana, и я хочу проверить, есть ли в этой структуре член с именем "AbsorbsEnergy" во время компиляции, используя:
if constexpr ( ... )
Как правильно это сделать в C ++ 17, который я использую?
Теперь, используя документацию по hana, я придумал следующее:
struct HasAE { double absorbedEnergy };
struct HasNoAE {};
temaplate<typename Cell>
void irelevantFunction(Cell& cell){
auto has_absorbedEnergy = hana::is_valid(
[](auto &&p) -> decltype((void) p.absorbedEnergy) {});
if constexpr(has_absorbedEnergy(cell)) { ... }
}
HasAE cell;
HasNoAE anotherCell;
cell.absorbedEnergy = 42; //value known at runtime
irelevantFunction(cell);
irelevantFunction(anotherCell);
Дело в том, что это прекрасно компилируется с g ++ 7.4.0 и делает то, что я ожидаю, но не компилируется с clang ++ - 8. Выдает ошибку:
constexpr, если условие не является постоянным выражением
Я подозреваю, что это происходит из-за того, что аргумент has_absorbedEnergy - cell не является постоянным выражением. Это можно обойти?
constexpr
здесь, кажется актуальным: stackoverflow.com/questions/55975924/ - person R2RT   schedule 07.05.2019cell
по значению и у него есть конструктор копирования constexpr, он будет работать. Неясно, передает лиcell
состояние выполнения. - person Jason Rice   schedule 16.05.2019