[英]C++ - Is there a way for a template class specialization to contain code from the general template?
給定一個 C++ 類:
template<typename T>
class A {
public:
int a;
T x;
int getA() {return a;}
};
模板特化是否有可能從 A 中“繼承”(沒有實際的 C++ 繼承)像 a 和 getA() 這樣的成員? 此外,在編寫對類進行大量模板特化的代碼時,我是否應該多次鍵入相同的代碼(這有點違背了模板的全部目的),或者重構類以適應特化(例如通過封裝另一個模板類成員,以便專門化僅限於該類)?
模板特化是否有可能從 A 中“繼承”(沒有實際的 C++ 繼承)像 a 和 getA() 這樣的成員?
簡短的回答:沒有。
長答案:不, A
是一個類模板,因此它不是您可以繼承成員(數據或函數)的東西。
此外,您所要求的聽起來像是 -我怎樣才能打敗專業化的全部目的? . 好吧,對於不依賴於模板參數的成員,從基類繼承。 這是實現此目的的更直接的方法以及該語言為您提供的功能。
您不能只從類型繼承成員函數而不擴展該類型。
有很多技術可以達到目的:直接繼承、mixin、inherit-from-above idiom等等。
它們都通過繼承來組成接口。 我不明白為什么要妖魔化它。
如果你不想要額外的課程,那么你可以像下面這樣欺騙:
template <class T>
class A {
public:
void f() { cout << "here" << endl; }
};
template <> class A<char> : private A<A<char> > {
public:
using A<A<char> >::f;
};
當然,有人希望能夠編寫template <> class A<char> : private A<char>
並獲得繼承自泛型的特化,但這是不可能的,所以我使用了一個技巧來實例化泛型某些類型的情況(這里類似於 CRTP,但可以使用任何其他類型)。
另一個技巧是使用第二種類型和默認值。
我找到了一個方法:
#include <type_traits>
typedef void**const*const** dummy;
// Generic template
template <typename T1, typename T2 = dummy>
class A {
static_assert(std::is_same<T1,dummy>::value || std::is_same<T2,dummy>::value,
"too many template arguments for class template 'A'");
typedef typename std::conditional<std::is_same<T1,dummy>::value, T2, T1>::type T;
public:
int a;
T x;
int getA() {return a;}
};
// Specialization for int
template <typename X>
class A<int,X> : public A<X,int> {
public:
void foo() {}
};
類模板 A 僅使用一個模板參數進行實例化。 當 A 使用 int 以外的任何類型實例化時,它具有泛型的所有成員,正如預期的那樣。 當 A 用 int 實例化時,它不僅有特化的成員,還有泛型的成員。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.