Предположим, что у меня есть эти объявления
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
не используется в частичной специализации.)