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.)