Как убедиться, что initializer_list не равен нулю - PullRequest
0 голосов
/ 19 февраля 2019

У меня есть конструктор, который принимает initializer_list в качестве аргумента:

A::A(std::initializer_list<uint32_t> arg)
    : vec(arg)
{
}

Проблема в том, что он допускает initializer_list нулевые или пустые значения для arg:

A {}

Как заставитьненулевой initializer_list?

Ответы [ 2 ]

0 голосов
/ 19 февраля 2019

Вы не можете сделать это со списками инициализаторов - вам придется выполнять проверку во время выполнения (не во время компиляции).

Но, просто для удовольствия: есливы готовы отказаться от списков инициализаторов и принять массив в качестве входных данных для вашего конструктора, вы можете получить то, что вы хотите.

class A {
 private:
  std::vector<int> v_;
 public:
  template<typename T, std::size_t N>
  A(const T(&v)[N]) : v_(std::begin(v), std::end(v)) {
    static_assert(N > 0, "Requires nonempty array.");
  }
};

int main() {
  int empty_arr[] = {};
  int arr[] = {1};
  // The following no longer works as there is no constructor that takes in as
  // input an initializer list.
  // A a{1};
  // A b{};
  A c({2});
  // So does this:
  A d(arr);
  // And this would be a compilation error, even if there was no static_assert.
  // C++ standard says you can't have an array of size zero. The static_assert in 
  // the class is just to make it easier for others to see what your intention is.
  // A e(empty_arr);
}
0 голосов
/ 19 февраля 2019

Когда инициализатором является {}, конструктор по умолчанию имеет приоритет над конструктором std::initializer_list, но последний будет использоваться, когда первого нет.Поэтому, чтобы вызвать ошибку компиляции, вам необходимо явно удалить конструктор по умолчанию, чтобы конструктор по умолчанию все еще был выбран, но не мог использоваться:

struct A {
    A() = delete;
    A(std::initializer_list<uint32_t>) { /* ... */ }
};

Однако во время компиляции вы можете 't запретить пользователю вручную создавать пустой объект std::initializer_list и передавать его внутрь. Вам нужно будет сгенерировать исключение, чтобы сигнализировать о сбое конструкции в этом случае.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...