Это может быть сделано только для агрегатов (массивов и определенных классов. Вопреки распространенному мнению, это работает и для многих неподов). Написание конструктора, который их принимает, невозможно.
Поскольку вы пометили его как "C ++ 0x", то это возможно. Волшебные слова это "Конструктор списка инициализатора". Это идет как
Phenotype(std::initializer_list<uint8> c) {
assert(c.size() <= std::size(m_array));
std::copy(c.begin(), c.end(), m_array);
}
// used like
Phenotype p1{1, 2, 3};
Phenotype p2({1, 3, 2}); // works too
Phenotype p3(1, 2, 3); // doesn't work
Однако при такой инициализации по умолчанию будет создан массив, а затем будет использоваться оператор присваивания. Если вы стремитесь к скорости и безопасности (вы получаете ошибки времени компиляции для слишком большого количества инициализаторов!), Вы также можете использовать обычный конструктор с шаблоном с переменным числом аргументов.
Это может быть более общим, чем необходимо (хотя часто вполне достаточно initializer_list, особенно для простых целых чисел). Он выигрывает от идеальной пересылки, так что аргумент rvalue может быть перемещен в элемент массива
template<typename ...T>
Phenotype(T&&...t):m_array{ std::forward<T>(t)... } {
}
// used like
Phenotype p1{1, 2, 3};
Phenotype p2(1, 2, 3); // works too
Phenotype p3({1, 2, 3}); // doesn't work
Это трудный выбор!
Редактировать Исправление, последний тоже работает, так как мы не сделали конструктор explicit
, поэтому он может использовать конструктор копирования Phenotype
, создавая временный объект Phenotype
и скопируйте его в p3
. Но это не то, что мы действительно хотим, чтобы звонки были:)