В целях тестирования я хочу вызвать конструктор с простым std::initializer_list
. Скажем, значение не имеет значения, а длина, значение и тип известны во время компиляции, например { 42, 42, 42,... N-times }
.
Поскольку его конструктор является частным, я попытал счастья с некоторым расширением пакета:
template< int Count, typename ValueType, int Value, int... Values >
struct Generator
: Generator< Count-1, ValueType, Value, Value, Values... >
{};
template< typename ValueType, int Value, int... Values >
struct Generator< 0, ValueType, Value, Values... >
{
static constexpr inline std::initializer_list<ValueType>
get()
{ return { static_cast<ValueType>(Values)... }; }
};
Итак, Generator<3,int,10>::get()
дает мне {10,10,10}
, да! Но у меня, похоже, есть проблема на время жизни, поскольку initializer_list
- это просто прокси-объект, возвращаемый из {..}
-выражения внутри функции. Тест не видит ожидаемых значений. Я что-то не замечаю?
struct A {
A(std::initializer_list<int> l)
{ for(auto i:l) std::cout << i << std::endl; }
};
int main() {
A a { Generator<3, int, 10>::get() };
return 0;
}
// prints:
// 32765
// 1762362376
// 32765
Live: https://godbolt.org/z/jYWKB3