你可以得到效果爲您正在尋找通過以下(打印出0 1,順便說一句):
#include <type_traits>
#include <iostream>
namespace detail
{
struct SZugBase{};
}
template <typename tTYPE>
struct SFoo
{
struct SZug : public detail::SZugBase {};
};
template<typename tType, bool IsFoo>
struct SBarBase
{
int value = 0;
};
template<typename tType>
struct SBarBase<tType, true>
{
int value = 1;
};
template <typename tTYPE>
struct SBar : public SBarBase<tTYPE, std::is_convertible<tTYPE, detail::SZugBase>::value>
{ /* stuff */ };
int main()
{
SBar<int> b0;
SBar<SFoo<int>::SZug> b1;
std::cout << b0.value << " " << b1.value << std::endl;
}
說明
首先,我們得到一個SZug
常規b類ASE:
namespace detail
{
struct SZugBase{};
}
template <typename tTYPE>
struct SFoo
{
struct SZug : public detail::SZugBase {};
};
注意以下幾點:
SZugBase
不受任何參數,所以很容易獨立地指的SFoo
SZugBase
參數來它是在一個detail
命名空間,所以,按照常見的C++約定,你告訴客戶端你的代碼忽略它。
現在我們給SBar
兩個基類,專業上的東西是否可以轉換爲的SZug
非模板的基礎:
template<typename tType, bool IsFoo>
struct SBarBase
{
int value = 0;
};
template<typename tType>
struct SBarBase<tType, true>
{
int value = 1;
};
最後,我們只需要做出SBar
這些基地的子類(取決於專業化):
template <typename tTYPE>
struct SBar : public SBarBase<tTYPE, std::is_convertible<tTYPE, detail::SZugBase>::value>
{ /* stuff */ };
請注意,你不擅長SBar
她e,你更專門化基類。不過,這實際上會產生相同的效果。
你打算做什麼之後?我不清楚你期望「專業化」做什麼。你能告訴我們你將如何聲明一個非專業化和專業化的SBar變量嗎? – Holt
我實際上將這些純粹用作特徵類型,所以它們從未實際實例化過。 Bar簡單地爲另一個(未提及的)類提供一個constexpr成員指針(以及其他一些東西)。通常情況下,成員指針需要明確指定,但對於「SZug」專業化可以確定。 - (最終這與從1到N通用容器生成N對N通用嵌入容器有關 - 成員指針指向用戶的容器或節點信息「嵌入」(即成員變量)類型)。 – xaxazak
我可以稍微修改一下'SZug'來檢測它,用SFINAE做你想做的事很容易(見我的答案)。如果你不能,我不確定是否有辦法檢測到'tTYPE'是'SFoo :: SZug'類。 –
Holt