У меня проблема с шаблонами и вычетом параметров. Вот код:
template<typename U, template<typename> class T>
void test(T<U>&& t)
{
...
}
Я ожидал, что это примет или lvalues и rvalues, но работает только с rvalues. Разрушающееся правило «Т»& && = Т&»не применяется в этом случае?
Естественно, я мог бы также объявить ссылочную функцию lvalue, но делает код менее читабельным.
Если вы спрашиваете, зачем мне это нужно, используйте static_assert для проверки T это особый класс. Если есть более простой способ сделать это, я буду рад изменить мой код, но я хотел бы знать, могут ли шаблоны шаблонов использоваться таким образом.
Спасибо
В отличие от typename T
, который может быть выведен как ссылочный тип, template<typename> class T
может быть выведен только как шаблон класса, так T<U>
всегда выводится на тип объекта.
Вы можете написать свою функцию на основе T
затем распакуйте тип шаблона в static_assert
:
template<typename T> struct is_particular_class: std::false_type {};
template<typename U> struct is_particular_class<ParticularClass<U>>: std::true_type {};
template<typename T> void test(T &&) {
static_assert(is_particular_class<std::remove_reference<T>::type>::value, "!");
}
Других решений пока нет …