Всем доброго времени суток.
Есть примерно такой код (навеяно библиотекой
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 начинает плющить, он не справляется с парсингом и кодогенерацией. Да и хочется синтаксически более читаемой конструкции.