Обычно, когда я пишу шаблоны, которые были бы специализированными, я сначала использую предварительное объявление и объявляю, что случаи относятся к специализациям. В вашем случае я понимаю, что вы пытаетесь написать вариационный шаблон без пустого пространства (т. Е. Вариационный шаблон, который может иметь хотя бы один тип).
Ваш код удивил меня, потому что я думаю, что вы правы, полная вариационная специализация вашей черты соответствует отверстиям ... Сначала я попытался использовать декларацию в прямом направлении вашего класса признаков и определить ТОЛЬКО полноразмерный специализация (Итак, если параметр признака не является экземпляром Wrapper
, компиляция не выполняется). И то, что именно имеет ocurred, снова разочаровать меня:
#include <iostream>
#include <utility>
template<typename F , typename... T>
struct Wrapper {};
template<typename T>
struct is_wrapper;
//template<typename T>
//struct is_wrapper : std::false_type {};
template<typename... T>
struct is_wrapper<Wrapper<T...>> : std::true_type {};
//template<typename F, typename... T>
//struct is_wrapper<Wrapper<F, T...>> : std::true_type {};
using my_wrapper_type = Wrapper<int,double>;
int main()
{
std::cout << std::boolalpha << is_wrapper<my_wrapper_type>::value << std::endl;
}//"Invalid use of incomplete type" ^^^^^^^^^^^^^^^^^^^^^^^^^^^
Наконец я попытался с помощью метода прямой декларации в Wrapper
классе. И удивительно, что это работает:
#include <iostream>
#include <utility>
template<typename... T>
struct Wrapper;
template<typename F, typename... T>
struct Wrapper<F,T...>{ };
template<typename T>
struct is_wrapper : std::false_type {};
template<typename... T>
struct is_wrapper<Wrapper<T...>> : std::true_type {};
//template<typename F, typename... T>
//struct is_wrapper<Wrapper<F, T...>> : std::true_type {};
using my_wrapper_type = Wrapper<int,double>;
int main()
{
std::cout << std::boolalpha << is_wrapper<my_wrapper_type>::value << std::endl;
}
Печатается:
истинные
Here это код работает на ideone.
С уважением, я не понимаю, почему ваш код не работает, а мои работы. Его ошибка компилятора, или есть что-то, чего нам не хватает? Не знаю.
Разница - это количество параметров шаблона для шаблона класса 'Wrapper'. Ваша (вторая) версия имеет только один параметр шаблона, тогда как версия OP имеет два параметра. Ваша частичная специализация 'struct Wrapper' не меняет этого. –
dyp
@DyP ОК, но если у вас есть шаблон с двумя параметрами (один параметр обычного шаблона и параметр вариационного шаблона), и вы передаете этот шаблон в виде вариационного пакета, то вариационный пакет не должен расширять соответствие первому нормальному параметру, и второй параметр (параметр вариации)?Это то, чего я не понимаю, почему пакет не расширяется таким образом. – Manu343726
Я все еще пытаюсь выяснить, где (и почему) Стандарт запрещает частичную специализацию для соответствия пакету параметров в этом случае. Угадайте, что это где-то рядом [temp.deduct.type]/9. (Расширение пакета отличается от вывода.) – dyp