Информация об изменениях

Сообщение Шаблоны и вывод типа от 04.04.2021 20:41

Изменено 04.04.2021 20:42 SaZ

Шаблоны и вывод типа
Всем доброго времени суток.

Есть примерно такой код (навеяно библиотекой sqlite_orm) на С++17:

#include <tuple>
#include <type_traits>

//------
auto make_object()
{
    return std::make_tuple(1, 2.0, "3"); // Тут возвращается достаточно сложный тип, основанный на вариадиках, не суть
}

//------
template<auto (*T)()> // ??? template<typename T = ...>
struct storage
{
    using storage_t = std::invoke_result_t<decltype(T)>;Нужно 
    storage_t _data;

    storage();
};

template<auto (*T)()>
storage<T>::storage()
    : _data{(*T)()}
{
}

//------
struct object_storage
    : storage<make_object>
{};


int main()
{
    object_storage st;
    return 0;
}


Вопрос: как ещё можно положить результат вызова make_object() в поле класса?

Меня несколько напрягает такой вывод типа. CLion начинает плющить, он не справляется с парсингом и кодогенерацией. Да и хочется синтаксически более читаемой конструкции.
Шаблоны и вывод типа
Всем доброго времени суток.

Есть примерно такой код (навеяно библиотекой sqlite_orm) на С++17:

#include <tuple>
#include <type_traits>

//------
auto make_object()
{
    return std::make_tuple(1, 2.0, "3"); // Тут возвращается достаточно сложный тип, основанный на вариадиках, не суть
}

//------
template<auto (*T)()> // ??? template<typename T = ...>
struct storage
{
    using storage_t = std::invoke_result_t<decltype(T)>;
    storage_t _data;

    storage();
};

template<auto (*T)()>
storage<T>::storage()
    : _data{(*T)()}
{
}

//------
struct object_storage
    : storage<make_object>
{};


int main()
{
    object_storage st;
    return 0;
}


Вопрос: как ещё можно положить результат вызова make_object() в поле класса?

Меня несколько напрягает такой вывод типа. CLion начинает плющить, он не справляется с парсингом и кодогенерацией. Да и хочется синтаксически более читаемой конструкции.