Предложение: попробуйте с
#include <vector>
template <template <typename...> typename Container, typename ... Ts>
struct SomeClass {
SomeClass(const Container<Ts...>& c) {
}
};
template <template <typename...> typename C, typename ... Ts>
inline auto make_some_class(const C<Ts...>& container) {
return SomeClass<C, Ts...>(container);
}
int main() {
std::vector<int> ints;
auto stuff = make_some_class(ints);
}
Я имею в виду ... Полагаю, проблема в том, что std::vector
не является контейнером, который получает один параметр шаблона типа; это контейнер, который получает параметр шаблона типа two (второй с типом по умолчанию: std::allocator<T>
, где T
- первый).
Таким образом, предложение: сделать SomeClass
более гибким и способным получать контейнер с переменным списком типов шаблонов аргументов
template <typename...> typename Container
и соответствующий список типов шаблонов
typename ... Ts
Если вам нужен переменный список аргументов (Ts...
), он нужен вам в последней позиции, поэтому вам нужно поменять позицию Container
и T
(теперь Ts...
): до Container
и после Вариационный список Ts...
template <template <typename...> typename Container, typename ... Ts>
struct SomeClass {
SomeClass(const Container<Ts...>& c) {
}
};
Строго не требуется, но для единообразия предлагаю переписать make_some_class()
таким же образом (и, очевидно, передать C
перед Ts...
в списке параметров шаблона).
template <template <typename...> typename C, typename ... Ts>
inline auto make_some_class(const C<Ts...>& container) {
return SomeClass<C, Ts...>(container);
}