Ни один из контейнеров не будет иметь нулевые накладные расходы.std::array
или std::initializer_list
даст вам наименьшую сумму стоимости, хотя.std::array
необходимо указать его тип и размер во время компиляции, поэтому он немного менее удобен для пользователя, чем std::initializer_list
в этом случае.Таким образом, использование std::initializer_list<const char*>
будет самым маленьким и простым в использовании «контейнером», который вы можете использовать.Это будет стоить размера массива указателей, генерируемых компилятором, и, возможно, немного больше, и не потребует динамического выделения памяти.
Если вы можете использовать C ++ 17, вы не будетедаже нужен контейнер.Используя шаблон переменной и сложенное выражение , вы можете передать все аргументы функции в виде отдельных параметров и применить одну и ту же операцию ко всем аргументам.
template<typename... Args>
bool good_strings(Args&&... args)
{
return (is_good(args) && ...);
}
превратит
all_good("a", "b", "c", "d", "e")
в
return is_good("a") && is_good("b") && ... && is_good("e");
, что использует короткое замыкание, поэтому оно прекратит оценку, как только первый вызов is_good
вернет false.
Вы можете использовать шаблон variadic в C ++ 11, но вам нужно будет либо использовать рекурсию, либо создать свой собственный массив, который на самом деле ничего не даст вам с такой дополнительной сложностью, как у вас.