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