Шаблоны и вывод типа
От: SaZ  
Дата: 04.04.21 20:41
Оценка:
Всем доброго времени суток.

Есть примерно такой код (навеяно библиотекой 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 начинает плющить, он не справляется с парсингом и кодогенерацией. Да и хочется синтаксически более читаемой конструкции.
Отредактировано 04.04.2021 20:42 SaZ . Предыдущая версия .
Re: Шаблоны и вывод типа
От: rg45 СССР  
Дата: 04.04.21 22:05
Оценка: 2 (1)
Здравствуйте, SaZ, Вы писали:


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


"Лобовой" вариант, который первым приходит в голову — использование частичной специализации:

http://coliru.stacked-crooked.com/a/ecccd0e27f6939e9

#include <tuple>

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

//------
template<auto>
struct storage;

template<typename R, R(*F)()>
struct storage<F>
{
    R _data{F()}; // Здесь default member initializer вместо определения default constructor
};

//------
// Здесь простой using-declaration вместо определения нового класса с наследованием
using object_storage = storage<make_object>;

int main()
{
    object_storage st;
}
--
Не можешь достичь желаемого — пожелай достигнутого.
Отредактировано 05.04.2021 8:28 rg45 . Предыдущая версия . Еще …
Отредактировано 05.04.2021 7:46 rg45 . Предыдущая версия .
Отредактировано 04.04.2021 22:48 rg45 . Предыдущая версия .
Отредактировано 04.04.2021 22:47 rg45 . Предыдущая версия .
Re[2]: Шаблоны и вывод типа
От: SaZ  
Дата: 05.04.21 10:02
Оценка:
Здравствуйте, rg45, Вы писали:

R>"Лобовой" вариант, который первым приходит в голову — использование частичной специализации:

R>http://coliru.stacked-crooked.com/a/ecccd0e27f6939e9
R>...

Спасибо, внезапно придумал написать template<auto T>. В моём случае тип вывелся корректно.
Re[3]: Шаблоны и вывод типа
От: rg45 СССР  
Дата: 05.04.21 10:31
Оценка: +2
Здравствуйте, SaZ, Вы писали:

SaZ>Спасибо, внезапно придумал написать template<auto T>. В моём случае тип вывелся корректно.


Здесь еще SFINAE напрашивается прикрутить — чтоб при попытке параметризовать шаблон чем-нибудь левым, ошибка возникала в месте использования, а не в потрохах шаблонного класса.
--
Не можешь достичь желаемого — пожелай достигнутого.
Re[4]: Шаблоны и вывод типа
От: SaZ  
Дата: 05.04.21 14:23
Оценка: +1
Здравствуйте, rg45, Вы писали:

R>Здравствуйте, SaZ, Вы писали:


SaZ>>Спасибо, внезапно придумал написать template<auto T>. В моём случае тип вывелся корректно.


R>Здесь еще SFINAE напрашивается прикрутить — чтоб при попытке параметризовать шаблон чем-нибудь левым, ошибка возникала в месте использования, а не в потрохах шаблонного класса.


Да. Но подожду концептов
Пишу консольную утилиту для кодогенерации в рамкаж текущих нужд проекта. Пока не особо заморачиваюсь над сопровождаемостью кода.
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.