я запутался о том, что работает и что не в ответе @RSahu и решает ли это проблему в целом.
Но, вдохновленный этим, я получаю следующее решение. Это просто использует тот факт, что класс шаблона класса может быть переменным. Так, например, теперь он совместим с std::vector<T, A>
или другими классами (контейнеры hopefuly), которые имеют более или менее параметры шаблона. На самом деле полезно сделать то же самое с параметром Ptr
, чтобы он также был совместим с std::unique_ptr
, который принимает больше параметров шаблона, чем std::shared_ptr
.
http://coliru.stacked-crooked.com/a/40d43526ed77eb9d
#include <iostream>
#include <vector>
#include <memory>
template<template<class...> class Ptr, template<class...> class Container, class T>
inline void f(Ptr<Container<T>> p) {
std::cout << "bla" << std::endl;
}
int main() {
f(std::make_shared<std::vector<int>>());
}
Примечание: сказав, что, я думаю, что есть более эффективные способы, чтобы ограничить типы аргументов, чем принуждая модели.
Например, это может быть альтернативой:
template<class PtrContainerT, typename = decltype(std::declval<PtrContainerT>()->back())> //probably pretty much constrains the intended use
inline void f(PtrContainerT&& p) {
using T = typename PtrContainerT::element_type::value_type; //in case you need to know T
std::cout << "bla" << std::endl;
}
http://coliru.stacked-crooked.com/a/fbe43aab94364764
или даже больше, до точки (хотя и не на 100% эквивалент):
template<class PtrContainerT, typename T = typename PtrContainerT::element_type::value_type> //probably pretty much constrains the intended use
inline void f(PtrContainerT&& p) {
std::cout << "bla" << std::endl;
}
Использование std::decay<PtrContainerT>::...etc
при необходимости ,
@ TheParamagneticCroissant Где я использовал его в качестве имени переменной? – xiver77
@ TheParamagneticCroissant, то в чем же проблема? – xiver77
@ TheParamagneticCroissant Нет ничего плохого в 'template class'. Это параметр шаблона без имени шаблона. –