LINUX.ORG.RU

Шаблоны, быдлокод, часть 1

 ,


1

3

Добрый день, начал разбираться с шаблонами в С++, сейчас знаю их хреново.

Есть тестовая программа.

Подскажите, пожалуйста, как надо изменить строку 57, либо конструктор класса Storage, чтобы заработала строка 57. В идеале я хочу просто иметь shared_ptr<T>, но при этом нужно уметь передавать параметры, спецефичные для <T>. Подскажите как это адекватно делать? Как я понял такая штука не прокатит (из-за разворачивания):

std::make_shared<T>(std::forward<Args>(args)...)

Может есть ещё замечания?

Хорошие книги/статьи на тему шаблонов в C++ так же приветствуются.

penetrator3000
() автор топика

Вот так нужно писать:

auto s4 = Storage<std::vector<int>>{std::vector<int>{1,2,3,4,5}};

fsb4000 ★★★★★
()

Подскажите, пожалуйста, как надо изменить строку 57, либо конструктор класса Storage, чтобы заработала строка 57.

Можешь добавить шаблон конструктора для initializer_list.

anonymous
()

Почитай книжку Майерса про современный C++. Там очень многое описывается (потенциальная проблема + ее решение).

Meyer ★★★★★
()

s4{std::initializer_list<int>{1,2,3}} - убирает variadic интерпретацию (которую vector не поддерживает).

а вот примерный SFINAE, чтобы два типа конструкторов уживались

template<typename A, typename = decltype(T(std::initializer_list<A>{}))>
explicit Storage<T>(std::initializer_list<A> a)
{
  m_spValue = std::make_shared<T>(a);
}

anonymous
()
Ответ на: комментарий от anonymous

Предлогаю использовать std::is_constructible вместо decltype(T(std::initializer_list<A>{}))

anonymous
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.