używanie SFINAE do specjalizacji klas szablonów

przypuśćmy, że mam te deklaracje

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

i chcesz wdrożyćUser<> dlaT = Data<some_type> i każda klasa pochodząca zData<some_type> ale także pozwalają na inne specjalizacje zdefiniowane gdzie indziej.

Jeśli nie mam jeszcze deklaracji szablonu klasyUser<>, Mógłbym po prostu

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

gdzie

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

Ma to jednak dwa parametry szablonu i dlatego koliduje z poprzednią deklaracją, gdzieUser<> jest zadeklarowany tylko z jednym parametrem szablonu. Czy mogę coś jeszcze zrobić?

(Uwaga

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

nie działa (domyślne argumenty szablonu nie mogą być używane w częściowych specjalizacjach), ani nie

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

ponieważ nie zezwala na typy pochodneData<>tak samo nie jest

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

odparametr szablonuT nie jest używany w częściowej specjalizacji.)

questionAnswers(3)

yourAnswerToTheQuestion