constexpr и порядок байтов

Неправильно создавал JHipster в DTO длинный usuarioId, затем на угловой стороне они получают всех пользователей и сравнивают идентификатор, когда я сохраняю сущность, получаю объект пользователя с помощью поиска UserService при входе в систему.

Так вот как это работает, я думаю, что некоторые могут найти полезным

сначала в отношениях ManyToMany

 @ManyToOne
 @JsonIgnoreProperties("")
 private User coordinador;
         public User getCoordinador() {
            return coordinador;
        }

        public ExtendedUser coordinador(User user) {
            this.coordinador = user;
            return this;
        }

        public void setCoordinador(User user) {
            this.coordinador = user;
        }

И в DTO

  private Long coordinadorId;

  private String coordinadorLogin;

  public Long getCoordinadorId() {
        return coordinadorId;
    }

    public void setCoordinadorId(Long userId) {
        this.coordinadorId = userId;
    }

    public String getCoordinadorLogin() {
        return coordinadorLogin;
    }

    public void setCoordinadorLogin(String userLogin) {
        this.coordinadorLogin = userLogin;
    }

С угловой стороны это выглядит так: component.html

 <div class="form-group">
                    <label class="form-control-label" jhiTranslate="sigemApp.extendedUser.coordinador" for="field_coordinador">Coordinador</label>
                    <select class="form-control" id="field_coordinador" name="coordinador" [(ngModel)]="extendedUser.coordinadorLogin" >
                        <option [ngValue]="null"></option>
                        <option [ngValue]="userOption.login" *ngFor="let userOption of users; trackBy: trackUserById">{{userOption.login}}</option>
    </select></div>

Наконец, в component.ts

users: IUser[];
 this.userService.query().subscribe(
            (res: HttpResponse<IUser[]>) => {
                this.users = res.body;
            },
            (res: HttpErrorResponse) => this.onError(res.message)
        );
 trackUserById(index: number, item: IUser) {
        return item.login;
    }
getSelected(selectedVals: Array<any>, option: any) {
        if (selectedVals) {
            for (let i = 0; i < selectedVals.length; i++) {
                if (option.id === selectedVals[i].id) {
                    return selectedVals[i];
                }
            }
        }
        return option;
    }

Чтобы сохранить его, я использую userService, чтобы получить Пользовательский объект пользователя, так в службе пользователя

    Optional<User> coordinador = userRepository.findOneByLogin(extendedUserDTO.getCoordinadorLogin());
  updateExtendedUser.setCoordinador(coordinador.get());
        extendedUserService.save(updateExtendedUser);
26
задан Xeo 18 December 2011 в 22:32
поделиться

4 ответа

Если предположить, что N2116 - это формулировка, которая будет включена, тогда ваш пример неверно сформирован (обратите внимание, что в C ++ нет понятия «законный / незаконный»). Предлагаемый текст для [decl.constexpr] / 3 говорит

  • , что его тело функции должно быть составным оператором формы {возвращаемое выражение; } где выражение - выражение потенциальной постоянной (5.19);

Ваша функция нарушает требование, поскольку она также объявляет локальную переменную.

Изменить : Это ограничение можно преодолеть, переместив num за пределы функции. Тогда функция по-прежнему не будет правильно сформирована, потому что выражение должно быть выражением потенциальной константы, которое определяется как

Выражение является выражением потенциальной константы, если оно является константой выражение, когда все вхождения параметров функции заменяются произвольными константными выражениями соответствующего типа.

IOW, reinterpret_cast (& num) [0] == 0xDD должно быть константным выражением. Однако это не так: & num будет адресным константным выражением (5.19 / 4). Однако доступ к значению такого указателя не разрешен для константного выражения:

Оператор индексации [] и доступ к члену класса. а также операторы, унарные операторы и и * и приведение указателей (кроме dynamic_cast, 5.2.7) могут использоваться при создании адресное постоянное выражение, но к значению объекта нельзя получить доступ с помощью этих операторов.

Изменить : Приведенный выше текст взят из C ++ 98. По-видимому, C ++ 0x более терпим, чем допускает постоянные выражения. Выражение включает преобразование lvalue-to-rvalue ссылки на массив, которое запрещено для константных выражений, если только

оно не применяется к lvalue эффективного целочисленного типа, который ссылается на в энергонезависимую константную переменную или инициализированный статический член данных с константными выражениями

Мне неясно, относится ли (& num) [0] "к" константной переменной, или же только литерал num "относится к" такой переменная. Если (& num) [0] относится к этой переменной, тогда неясно, относится ли reinterpret_cast (& num) [0] к « число .

12
ответ дан 28 November 2019 в 07:20
поделиться

Самым простым было бы просто изменение бросок в Вашей функции:

constexpr bool little_endian()
{
    return 0xDD == (const uint8_t&)0xAABBCCDD;
}

, как уже упомянуто ранее.

0
ответ дан Bohdan 19 July 2019 в 07:21
поделиться

Это очень интересный вопрос.

Я не специалист по языкам, но вы могли бы заменить reinterpret_cast объединением.

const union {
    int int_value;
    char char_value[4];
} Endian = { 0xAABBCCDD };

constexpr bool little_endian()
{
   return Endian[0] == 0xDD;
}
4
ответ дан 28 November 2019 в 07:20
поделиться

Если ваша цель - убедиться, что компилятор оптимизирует little_endian () до константы true или false во время компиляции, без того, чтобы какое-либо его содержимое попадало в исполняемый файл или выполняются во время выполнения и генерируют код только из "правильного" одного из двух ваших Foo шаблонов, боюсь, вас ждет разочарование.

Я тоже не юрист по языку, но мне кажется, что constexpr похоже на inline или register : ключевое слово, которое предупреждает автора компилятора о наличии потенциальной оптимизации. Тогда разработчик компилятора решает, использовать это в своих интересах или нет. Спецификации языка обычно требуют поведения, а не оптимизации.

Кроме того, Вы действительно пробовали это на различных компиляторах жалоб C ++ 0x, чтобы увидеть, что происходит? Я предполагаю, что большинство из них задохнется от ваших двойных шаблонов, поскольку они не смогут понять, какой из них использовать, если они будут вызваны с false .

-3
ответ дан 28 November 2019 в 07:20
поделиться
Другие вопросы по тегам:

Похожие вопросы: