Начиная с C ++ 17, теперь намного проще создать экземпляр класса, который имеет много параметров шаблона, которые могут быть автоматически выведены из вызова конструктора.
В моем проекте у меня есть иерархия классов шаблонов, которая можетбыть вложенными друг в друга, что приводит к огромным именам типов, что является причиной, по которой вывод аргументов шаблона класса так хорош.
Однако я использую статические фабричные методы для упрощения динамического конструирования классов (в основном я просто возвращаю shared_ptrs, содержащий только что созданный объект).Как и в приведенном ниже примере
#include <iostream>
#include <memory>
template <typename T>
struct S {
const std::shared_ptr<T> m_t;
S(std::shared_ptr<T> t):
m_t {std::move(t)} {}
template<typename ...Args>
static S create(Args&&... args);
};
template <typename T>
template <typename ...Args>
std::shared_ptr<S<T>> S<T>::create(Args&&... args) {
return std::make_shared<S<T>>(std::forward<Args>(args)...);
}
int main() {
auto s1 = S{std::make_shared<int>(6)};
// auto s2 = S::create(std::make_shared<int>(5)); // DOESN'T work
}
Мне нужны указатели для включения полиморфизма (если нет другого способа, которому не нужны указатели - возможно, CRTP), но я не вижу способа сделать процесс создания экземпляров простым, без бремени указания полного типа возвращаемого объекта где-либо.