假设我有这些声明使用SFINAE模板类专业化
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
部分特例不被使用。)
SFINAE ** can **应用于挑选模板专门化,请参阅http://en.cppreference.com/w/cpp/types/enable_if – Walter
因此它可以!我学到了东西。 –
我不认为我明白为什么'static_assert'版本不起作用。谨慎阐述? – jrok