[英]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
我理解b2
和b3
的聲明是錯誤的,因為A::AA
是不完整的, A<int>::AA
不是模板。
我希望能夠聲明類似於b2
東西。 這個想法是A
和B
都應該使用相同的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
還有其他可能嗎? 如果有,怎么樣?
編輯 :在template
為B
添加了遺忘的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.