Время жизни временного std::array
От: Muxa  
Дата: 05.07.19 11:11
Оценка:
Есть объекты
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;
}
Отредактировано 05.07.2019 11:15 Muxa . Предыдущая версия .
Re: Время жизни временного std::array
От: night beast СССР  
Дата: 05.07.19 11:19
Оценка: 6 (1)
Здравствуйте, Muxa, Вы писали:

M>Лучшее что я придумал это:

M>
func(std::array<object_ptr, 2>{ pointer0, pointer1, }.data(), 2);


M>Корректен ли данный вызов?


да

M>Не будет ли объект std::array удален до входа в func?


не будет
Re: Время жизни временного std::array
От: rg45 СССР  
Дата: 05.07.19 11:52
Оценка: 6 (1) +1
Здравствуйте, 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});
--
Не можешь достичь желаемого — пожелай достигнутого.
Re[2]: Время жизни временного std::array
От: Muxa  
Дата: 05.07.19 11:56
Оценка:
функций типа func много — надо будет нагенерить оберток под каждую
но спасибо за идею
буду иметь в виду
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.