[英]How to compile-time condition on template typename?
假設我有一個class A
模板,如下所示:
template<typename T>
class A
{
T data;
public:
void func(){} //concerned function ** see here **
};
現在我有另一個class B
模板,說
template<typename U>
class B
{
// ... something whatever
};
這意味着不構造函數的條件是立即模板typename T
為B
C
可以是任何類型,包括A
和B
除非使用過,否則不會生成類模板的成員函數。 這是該機制實力的一部分。
如果要限制此成員函數的使用,則確實可以使用std::is_same
。 訣竅是定義適當的特征/元功能:
template<class, template<class...> class> struct is_template_instance : std::false_type {}; template<template<class...> class T, class... Cs> struct is_template_instance<T<Cs...>, T> : std::true_type {};
只會為is_template_instance<std::vector<int>, std::vector>
類的東西選擇真正的專業化。 現在只需使用它即可,無論是靜態assert還是std::enable_if
:
auto func() -> typename std::enable_if<!is_template_instance<T, B>::value>::type { }
您需要部分專門化模板:
template<typename C>
class A<B<C>> // Used when A<B<C>> is instantiated
{
B<C> data;
};
唯一的缺點是,這需要一些代碼重復,而這並非總是可能的。
相反,您可以創建具有所有功能的基類,並從該基類派生:
// Base class with all the common functionality.
template<typename T>
class A_impl
{
protected:
T data;
};
// Special case when 'func' is available.
template<typename T>
class A : public A_impl<T>
{
public:
void func() {}
};
// Another special case where 'func' is not available.
template<typename C>
class A<B<C>> : public A_impl<B<C>> {
};
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.