Здравствуйте, Muxa, Вы писали:
M>Лучшее что я придумал это:
M>func(std::array<object_ptr, 2>{ pointer0, pointer1, }.data(), 2);
Почуму бы не написать функцию-обертку:
void func(std::itializer_list<object_ptr> pointers)
{
func(pointers.begin(), pointers.size());
}
И вызывать ее так:
func({pointer0, pointer1, pointer2});
Здравствуйте, Muxa, Вы писали:
M>Лучшее что я придумал это:
M>func(std::array<object_ptr, 2>{ pointer0, pointer1, }.data(), 2);
M>Корректен ли данный вызов?
да
M>Не будет ли объект std::array удален до входа в func?
не будет
Есть объекты
typedef struct object
{
object() { std::cout << "ctor " << this << std::endl; }
~object() { std::cout << "dtor " << this << std::endl; }
} *object_ptr;
object object0;
object object1;
, указатели на них
object_ptr pointer0 = &object0;
object_ptr pointer1 = &object1;
и функция принимающая массив указателей
void func(object_ptr *pointers, size_t n);
Чего хотелось бы:
одной строкой вызвать функцию func не объявляя дополнительных переменных, передав в нее массив из этих указателей
Зачем:
1. код генерится автоматически — генерить одну строку немного проще
2. дополнительно объявленные переменные будут жить до выхода из скоупа, чего хочется избежать, так как такого кода может нагенериться очень много — да, можно ограничить время жизни дополнительных переменных фигурными скобками, но это опять же усложнит генератор и его использование
Лучшее что я придумал это:
func(std::array<object_ptr, 2>{ pointer0, pointer1, }.data(), 2);
Корректен ли данный вызов?
Не будет ли объект std::array удален до входа в func?
с++17
компиляторы msvc, gcc, clang
OS win, lin, mac
Спасибо.
| код целиком |
| https://gcc.godbolt.org/z/ZDuCqS
#include <stdlib.h>
#include <iostream>
#include <array>
typedef struct object
{
object() { std::cout << "ctor " << this << std::endl; }
~object() { std::cout << "dtor " << this << std::endl; }
} *object_ptr;
object object0;
object object1;
void func(object_ptr *pointers, size_t n)
{
for (size_t i = 0; i < n; ++i)
std::cout << "func " << pointers[i] << std::endl;
}
int main()
{
object_ptr pointer0 = &object0;
object_ptr pointer1 = &object1;
func(std::array<object_ptr, 2>{ pointer0, pointer1, }.data(), 2);
return 0;
}
|
| |