假設我有這些聲明使用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