簡體   English   中英

如何使用模板模板參數類型的引用類型模板參數定義 class 模板

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

與 C++11 一起編譯

暫無
暫無

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

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