簡體   English   中英

C++ - 模板類專業化有沒有辦法包含來自通用模板的代碼?

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM