[英]How to define a class template with reference type template parameter of template template parameter type
I would like to define a class template (hereafter called C
) which takes a reference to an object of an to-be instantiated class template (hereafter called S
) as template parameter. 目標是C
可以用一個模板參數完全實例化。
S
本身就是一個 class 模板,它有一個整型模板參數。 C
class 模板應使用對任何S
實例化的 object 的引用來實例化。
這就是我想要實現的目標:
template<int I> struct S {
int get() { return 42 + I; }
};
// ↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓ my desperate attempt
template< typename S<int I>::template & n>
struct C {
int get() {
return n.get();
}
};
S<42> s;
int main()
{
C<s> c;
return c.get();
}
我使用的編譯器支持 GNU++11 或更早版本。
在 C++11 中,我不知道這將允許您僅更改模板參數以執行您想要的操作。 您可以做的不是有一個非類型模板參數,而只是一個類型,並向C
添加一個構造函數,它將對所需 object 的引用作為參數:
template<typename T>
struct C {
C(T &t): t(t) {}
int get() {
return t.get();
}
private:
T &t;
};
然后你可以聲明c
如下:
C<decltype(s)> c(s);
然而,這樣重復自己當然不是很好,所以訣竅是制作一個模板化的 function,它將為您構造一個正確類型的C
:
template<typename T>
C<T> make_C(T &t) {
return C<T>(t);
}
然后你可以寫:
auto c = make_C(s);
在 C++17 中,您可能會這樣做
template<int I> struct S { int get() { return 42 + I; } };
template <auto& n>
struct C;
template <int I, S<I>& n>
struct C<n>
{
int get() { return n.get(); }
};
S<42> s;
int main()
{
C<s> c;
return c.get();
}
演示。
在 C++17 之前, template <auto& n> struct C;
必須更換。 例如通過
template <typename T, T& n> struct C;
template <typename T, T& n>
struct C;
template <int I, S<I>& n>
struct C<S<I>, n>
{
int get() { return n.get(); }
};
S<42> s;
#define AUTO(x) decltype(x), x
int main()
{
C<S<42>, s> c;
// C<AUTO(s)> c;
return c.get();
}
這不是答案。 但也許這可以幫助偶然發現這個問題的人,甚至幫助某人真正找到答案。
與原始問題相比,我添加了 static 成員變量Si
。
template<int I> struct S {
static constexpr int i = I;
int get() { return 42 + I; }
};
template<int I, S<I>& n> struct C
{
int get() {
return n.get();
}
};
S<42> s;
int main()
{
C<s.i, s> c;
return c.get();
}
這不是答案,因為仍然需要兩個模板 arguments才能實例化 class 模板C
。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.