簡體   English   中英

在C ++中使用模板化類的嵌套類作為模板模板參數

[英]Use nested class of templated class as template template parameter in C++

在C ++中,我想在模板化的類中使用嵌套類作為模板模板參數。 對於非嵌套類,模式為:

template<class T>
class A {
public:
    T a;
    // ...
};

template<class T, template<class ST> class S>
class B {
public:
    S<T> b;
    // ...
};

B<int, A> b;

現在我想向A添加一個嵌套類,並使用這個嵌套類作為B類的模板模板參數S ,如下所示:

template<class T>
class A {
public:
    class AA {
    public:
        T aa;
        // ...
    };
    // ...
};

template<class T, template<class ST> class S>
class B {
public:
    S<T> b;
    // ...
};

B<int, A> b1;          // ok
B<int, A::AA> b2;      // error
B<int, A<int>::AA> b3; // error

我理解b2b3的聲明是錯誤的,因為A::AA是不完整的, A<int>::AA不是模板。

我希望能夠聲明類似於b2東西。 這個想法是AB都應該使用相同的T類。

我希望能夠聲明一些類似於A的類,並使用單獨命名的子類。 我可以想到的另一個用途是A多個子類,可以用作B模板模板參數。

我看到的一個解決方法是避免在A的子類上使用單個名稱,使用b1聲明(使用A作為B模板模板參數S )並相應地更改B的實現(即使用S::AA<T>而不是S<T> ):

template<class T, template<class ST> class S>
class B {
public:
    S::AA<T> b;
    // ...
};

B<int, A> b;

我看到的另一種解決方法是將B類的模板模板參數減少為一個簡單的模板參數,並通過其他方式確保相同的T

還有其他可能嗎? 如果有,怎么樣?

編輯 :在templateB添加了遺忘的class ,並將模板模板參數名稱更改為ST

這對我有用:

template<class T>
class A {
public:
    class AA {
    public:
        T aa;
        // ...
    };
    // ...
};

template<class T, template<class ST> class S >
class B {
public:
    S<T> b;
    // ...
};

template<class T> using NestedAA = typename A<T>::AA;

int main()
{
  B<int, NestedAA> b; // ok

  return 0;
}

如果由於任何原因您受限於C ++ 03,則無法使用類型別名。 然后,您可以使用以下NestedAA定義替換“using”語句:

template<class T>
class NestedAA : public A<T>::AA
{
};

假設您希望嵌套的情況起作用,並且由於AA本身不是模板,您可以刪除B的第二個參數的模板,如下所示:

template<class T>
class A {
public:
    class AA {
    public:
        T aa;
        // ...
    };
    // ...
};

template<class T, class S>
class B {
public:
    S b;
    // ...
};

//B<int, A> b1;          // error
B<int, A<int>::AA> b2;      // ok

PS你原來的B聲明需要一個額外的'class'來編譯g ++ 5.4

template<class T, template<class T> class S>

您可以創建模板別名:

template <typename T>
using innerAA = typename A<T>::AA;

然后

B<int, innerAA> b42;

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

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