Если вы используете C ++ 11 или выше, вы могли бы вызывать SetTitles
в качестве переменной функции (той, которой можно передать переменное число аргументов) с помощью пакетов параметров.
template<class ...Ts>
void SetTitles(Ts... args) // accepts an arbitrary number of arguments
{
std::vector<String> names {args...}; // unpacks the arguments into an initialiser list
// and constructs a vector with it
const int size = std::min(9, names.size()); // size should be no bigger than 9
// to prevent undefined behaviour
// loop through the vector as normal
for (int i = 0; i < size; i++)
Titles[i] = names[i];
}
Это позволяет:
Organ_Levels.SetTitles("", "Rot", "Tone", "Sprd", "Bal", "Upper", "Lower", "Pedal", "Volume");
и даже больше:
Organ_Levels.SetTitles("p", "a", "r", "a", "m", "e", "t", "e", "r", " ", "p", "a", "c", "k", " ", "a", "b", "u", "s", "e");
Однако, поскольку Generator::Titles
имеет размер, установленный на9, последний пример будет содержать не более 9 заголовков.Чтобы сделать это число динамическим, рассмотрите возможность изменения массива String Titles[]
на std::vector
(например, std::vector<String> Titles
).Обратите внимание, что вам может потребоваться изменить и другие части кода (например, массив int16_t Values[]
).Есть также дополнительное преимущество, заключающееся в том, что вы можете устранить цикл, непосредственно скопировав вектор:
template<class ...Ts>
void SetTitles(Ts... args)
{
std::vector<String> names {args...};
// works if Titles is an std::vector
Titles = names;
// Titles = std::vector<String>{args...}; // should also work
}
Благодаря подсказке Кристофа .