использование SFINAE для специализации класса шаблона
Предположим, у меня есть эти заявления
template<typename T> class User;
template<typename T> class Data;
и хочу реализоватьUser<>
заT = Data<some_type>
и любой класс, полученный изData<some_type>
но также учитывают другие специализации, определенные в другом месте.
Если у меня еще не было объявления шаблона классаUser<>
Я мог бы просто
template<typename T,
typename A= typename std::enable_if<is_Data<T>::value>::type>
class User { /*...*/ };
где
template<template<typename> data>> struct is_Data
{ static const bool value = /* some magic here (not the question) */; };
Тем не менее, он имеет два параметра шаблона и, следовательно, конфликтует с предыдущим объявлением, гдеUser<>
объявляется только с одним параметром шаблона. Есть ли что-нибудь еще, что я могу сделать?
(Запись
template<typename T,
typename A= typename std::enable_if<is_Data<T>::value>::type>
class User<T> { /*...*/ };
не работает (аргументы шаблона по умолчанию не могут использоваться в частичных специализациях) и не делает
template<typename T> class User<Data<T>> { /*...*/ };
так как он не допускает типы, полученные изData<>
также
template<typename T>
class User<typename std::enable_if<is_Data<T>::value,T>::type>
{ /*...*/ };
посколькупараметр шаблонаT
не используется в частичной специализации.)