Шаблонные функции и вычет параметров

У меня проблема с шаблонами и вычетом параметров. Вот код:

template<typename U, template<typename> class T>
void test(T<U>&& t)
{
...
}

Я ожидал, что это примет или lvalues ​​и rvalues, но работает только с rvalues. Разрушающееся правило «Т»& && = Т&»не применяется в этом случае?

Естественно, я мог бы также объявить ссылочную функцию lvalue, но делает код менее читабельным.

Если вы спрашиваете, зачем мне это нужно, используйте static_assert для проверки T это особый класс. Если есть более простой способ сделать это, я буду рад изменить мой код, но я хотел бы знать, могут ли шаблоны шаблонов использоваться таким образом.

Спасибо

5

Решение

В отличие от 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, "!");
}
3

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]