Конструктор делегата и аргумент по умолчанию в зависимости от других аргументов - PullRequest
0 голосов
/ 12 января 2019

У меня есть конструктор для B с некоторым аргументом по умолчанию в зависимости от других аргументов:

struct A
{
    int f();
    A(const A&) = delete;
    A(A&& );
    // ....
};

struct B
{
    B(A a, int n=a.f()) {//...}
    // ...
};

Это явно не работает таким образом, поэтому я хочу использовать конструктор делегата:

struct B
{
      B(A a, int n) {//...}
      B(A a): B(a, a.f()) {}
};

Это, однако, также не работает, потому что конструктор копирования A удален. Поэтому мне нужно что-то вроде

struct B
{
      B(A a, int n) {//...}
      B(A a): B(std::move(a), a.f()) {}
};

Насколько я знаю, однако, нет гарантии, что a.f () будет вычислена перед std :: move, поэтому результат не определен. Есть ли возможность получить значение a.f () перед std :: move или мне лучше написать два отдельных конструктора?

Ответы [ 2 ]

0 голосов
/ 12 января 2019

Почему бы вам не сделать что-нибудь попроще - то есть перегрузить ваш конструктор?

struct B
{
    B(A a) {
        int n = a.f();
        ...
    }
    B(A a, int n) {
        ...
    }
};

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

0 голосов
/ 12 января 2019

Чем больше возможных решений для этого.

  1. Самый простой подход - сделать a указатель:

    struct B
    {
         B(A* a, int n) {...}
         B(A* a): B(a, a->f()) {}
    };
    
  2. Более сложный подход - попытаться сделать ссылку a:

    struct B
    {
          B(A& a, int n) {...}
          B(A& a): B(a, a.f()) {}
    };
    

Я бы не предложил это решение. Указатель - более чистый подход.

Edit:

  1. Через std :: перейти из служебной библиотеки

    struct B
    {
          A&& a:
          int n:
    
          B(A&& a, int n): a(std::move(a)), n(n) {...}
          B(A&& a): B(std::move(a), a.f()) {...}
    };
    
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...