usando SFINAE para especialização de classe de modelo

suponha que eu tenho essas declarações

template<typename T> class User;
template<typename T> class Data;

e quer implementarUser<> paraT = Data<some_type> e qualquer classe derivada deData<some_type> mas também permitem outras especializações definidas em outro lugar.

Se eu ainda não tivesse a declaração do modelo da turmaUser<>Eu poderia simplesmente

template<typename T,
         typename A= typename std::enable_if<is_Data<T>::value>::type>
class User { /*...*/ };

Onde

template<template<typename> data>> struct is_Data
{ static const bool value = /* some magic here (not the question) */; };

No entanto, isso tem dois parâmetros de modelo e, portanto, colide com a declaração anterior, ondeUser<> é declarado com apenas um parâmetro de modelo. Há algo mais que eu possa fazer?

(Nota

template<typename T,
         typename A= typename std::enable_if<is_Data<T>::value>::type>
class User<T> { /*...*/ };

não funcionaArgumentos de modelo padrão não podem ser usados ​​em especializações parciais), nem faz

template<typename T> class User<Data<T>> { /*...*/ };

como não permite tipos derivados deData<>, nem

template<typename T>
class User<typename std::enable_if<is_Data<T>::value,T>::type>
{ /*...*/ };

Desde aparâmetro de modeloT não é usado em especialização parcial.)

questionAnswers(3)

yourAnswerToTheQuestion