Я хочу иметь шаблонную функцию в C++, где один параметр шаблона сам является шаблоном другого параметра шаблона. Если это не имеет никакого смысла, возьмите следующий код, который печатает зЬй :: вектора, который шаблонный по типу ТВложенные параметры шаблона C++ для функций
template <typename T>
void print_vector(std::vector<T> &vec)
{
for(auto v: vec)
std::cout << v << " ";
std::cout << std::endl;
}
...
std::vector<double> vec(5);
...
print_vector(vec);
Я хочу, чтобы в дальнейшем обобщить эту функцию для других, чем вектор STL контейнеров. Но я не знаю, как «гнездо» параметры шаблона таким образом, что контейнер шаблонный по типу T. Я попытался следующие без успеха
template <typename T, template <typename TT> V>
void print_container(V<T> &con)
{
for(auto c: con)
std::cout << c << " ";
std::cout << std::endl;
}
...
std::vector<double> vec(5);
...
print_container(vec);
, я уверен, это было до того здесь ответа, но Я не могу найти поисковые запросы, чтобы найти ответ.
EDIT: Спасибо @ForEveR, ваш ответ был прямо на деньги! Все ответы на мой вопрос, заметил, что там нет необходимости иметь тип «хранения» T шаблонного, следующим раствором быть достаточным для примера я дал:
template <typename C>
void print_container(C &con)
{
for(auto v: con)
std::cout << v << " ";
std::cout << std::endl;
}
К сожалению, фактическое использование дела, которые мотивировали вопрос было немного сложнее. Процедура занимает несколько контейнеров, как этот линейный пример алгебры с матрицей и вектором классом:.
template <typename MATRIX, typename VECTOR>
void mat_vec_multiply(const MATRIX &A, const VECTOR &x, VECTOR &y)
{
// implement y = A*x;
}
Предположит, что оба MATRIX и VECTOR классы должны быть шаблонными на тот же базовом класс хранения (т.е. дважды, поплавок, ква ...). Идея заключается в том, что путем явного указания Т в качестве параметра шаблона, мы можем применять это:
template < typename T,
template<typename> class MATRIX,
template<typename> class VECTOR>
void mat_vec_multiply(const MATRIX<T> &A, const VECTOR<T> &x, VECTOR<T> &y)
{
// implement y = A*x;
}
К сожалению, я с помощью компилятора CUDA NVCC, который не имеет никакой поддержки для C++ 11 конструктов (я просто использовал C++ 11 в моем примере, потому что он менее подробный). Поэтому я не могу использовать std :: is_same и static_assert, хотя, я полагаю, я мог бы свернуть собственный is_same (или использовать BOOST) достаточно легко. Что такое «наилучшая практика» в этом случае, когда я хочу применить параметр шаблона commone для классов хранения?