использование 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 не используется в частичной специализации.)

Ответы на вопрос(3)

Ваш ответ на вопрос