Size: a a a

2020 July 02

AS

Alex Sandrov in pro.cxx
у меня функция возвращает объект, который можно скастовать к нужному типу
источник

AS

Alex Sandrov in pro.cxx
это всё статически делается
источник

AS

Alex Sandrov in pro.cxx
но проблем нет, всё известно на момент компиляции
источник

NP

Nikita Provotorov in pro.cxx
Alex
Посоветуйте, пожалуйста. Есть функция-фабрика, которая конструирует шаблонный класс. Проблема в том, что шаблонные параметры определяется в рантайме, они заранее не известны, и даже их (параметров) число может различаться. Функция может сконструировать нужный класс, но не может вернуть, потому что не известен возвращаемый тип на этапе компиляции. Есть какой-то приём для такой ситуации?
передавай в factory шаблонный функтор, которому при вызове можно будет скормить созданный объект
источник

NP

Nikita Provotorov in pro.cxx
или для частного случая std::variant, как тут уже и посоветовали, ещё можно std::any
источник

A

Alex in pro.cxx
Nikita Provotorov
передавай в factory шаблонный функтор, которому при вызове можно будет скормить созданный объект
Не вижу, как это решает задачу, ведь чтобы передать его в фабрику, я тоже должен указать его конкретный тип. Что фабрика может сделать - это вызвать чей-то чужой шаблнный метод, сейчас подумаю.
источник

АК

Александр Караев... in pro.cxx
Alex
Мда, совсем не вяжется статический полиморфизм с динамическим
вяжется, просто надо вовремя стирать тип
источник

A

Alex in pro.cxx
Стереть не проблема, проблема восстановить
источник

АК

Александр Караев... in pro.cxx
процесс восстановления всегда настраивается в тот момент, когда ты стираешь
источник

АК

Александр Караев... in pro.cxx
начни с того, как именно ты планируешь использовать значение, возвращаемое factory
источник

АК

Александр Караев... in pro.cxx
обычно вдумчивое осознавание факта, что в любой точке программы известен конкретный статический тип любого объекта, приводит к решению проблемы
источник

NP

Nikita Provotorov in pro.cxx
Alex
Не вижу, как это решает задачу, ведь чтобы передать его в фабрику, я тоже должен указать его конкретный тип. Что фабрика может сделать - это вызвать чей-то чужой шаблнный метод, сейчас подумаю.
template<typename... Ts>
class A {};

template<typename F>
void factory(F&& consumer)
{
   if (runtime_condition_1())
       return (void)std::forward<F>(consumer)(A<int, float>{});
   else if (runtime_condition_2())
       return (void)std::forward<F>(consumer)(A<std::string>{});

   return (void)std::forward<F>(consumer)(A<void>{});
}

struct ConsumerExample
{
   template<typename... Ts>
   void operator()(A<Ts...>&& obj)
   {
   }
};
источник

NP

Nikita Provotorov in pro.cxx
вот что я имел в виду
источник

VF

Vitaly Farmov in pro.cxx
Alex
Посоветуйте, пожалуйста. Есть функция-фабрика, которая конструирует шаблонный класс. Проблема в том, что шаблонные параметры определяется в рантайме, они заранее не известны, и даже их (параметров) число может различаться. Функция может сконструировать нужный класс, но не может вернуть, потому что не известен возвращаемый тип на этапе компиляции. Есть какой-то приём для такой ситуации?
Попробуйте тут посмотреть
https://github.com/farmovit/heterogeneous_factory
источник

m

magras in pro.cxx
Nikita Provotorov
вот что я имел в виду
Я думаю можно было просто сказать "паттерн visitor".
источник

NP

Nikita Provotorov in pro.cxx
Александр Караев
начни с того, как именно ты планируешь использовать значение, возвращаемое factory
а вот тут я согласен, какой смысл возвращать что то, с чем потом неизвестно как работать
источник

АК

Александр Караев... in pro.cxx
Nikita Provotorov
template<typename... Ts>
class A {};

template<typename F>
void factory(F&& consumer)
{
   if (runtime_condition_1())
       return (void)std::forward<F>(consumer)(A<int, float>{});
   else if (runtime_condition_2())
       return (void)std::forward<F>(consumer)(A<std::string>{});

   return (void)std::forward<F>(consumer)(A<void>{});
}

struct ConsumerExample
{
   template<typename... Ts>
   void operator()(A<Ts...>&& obj)
   {
   }
};
шикарное решение :)
источник

NP

Nikita Provotorov in pro.cxx
magras
Я думаю можно было просто сказать "паттерн visitor".
ну да)
источник

A

Alex in pro.cxx
Спасибо, я уже думал про вызов чужого шаблонного метода вместо возврата значения, но не подумал вынести это в отдельный спец. класс
источник

AS

Alex Sandrov in pro.cxx
это классическая проблема в type_erasure
источник