簡體   English   中英

C++ 具有類型和非類型參數混合的可變參數模板,用於遞歸 inheritance

[英]C++ variadic templates with type and non-type argument mixing for recursive inheritance

我想實現這一點:

Foo<int, 5, double, 7> foo_1;
Foo<char, 7> foo_2;

foo_1.Foo<int>::value[4] = 1;
foo_2.Foo<char>::value[1] = 'x';

(這是一個過於簡單的例子, Foo的作用遠不止於此。)

如何使用可變參數模板做到這一點?

TLDR;

我知道如果只使用類型或非類型,可以以這種方式使用可變參數模板:

template <typename ...T>
struct Foo;

template<typename T, typename ...Args>
struct Foo<T, Args...> : Foo<T>, Foo<Args...> {
    Foo(T t, Args... args) : Foo<T>(t), Foo<Args...>(args...) { }
};

template<typename T>
struct Foo<T> {
    T value;

    Foo<T>(T v) : value(v) {}
};

Foo<int, double, char> f(7, 88.1, 'x');
f.Foo<double>::value = 5;

但我不知道是否可以使用可變參數模板配對和混合類型和非類型模板 arguments。

這是不可能的。 您必須滿足以下條件之一:

Foo<Bar<int, 5>, Bar<double, 7>> foo_1;
Foo<int, Bar<5>, double, Bar<7>> foo_1;
// ...?

如果值總是整數,你也可以試試這個:

Foo<int[5], double[7]> foo_1;

然后從每個參數中提取元素類型和范圍。

但我不知道是否可以使用可變參數模板配對和混合類型和非類型模板 arguments。

不使用備用可變參數模板。 但是您可以包裝幾種類型/尺寸。

假設你有一個Bar class 如下

template <typename T, std::size_t N>
struct Bar
 { std::array<T, N>  value; };

使用 class 專業化,您可以擁有一個可變參數Bar所以一個可變參數類型列表一個可變參數大小列表

template <typename...>
struct Foo;

template <typename ... Ts, std::size_t ... Ns>
struct Foo<Bar<Ts, Ns>...> : public Bar<Ts, Ns>...
 { };

您可以按如下方式使用它

   Foo<Bar<int, 5>, Bar<double, 7>> foo_1;
   Foo<Bar<char, 7>> foo_2;

   foo_1.Bar<int, 5>::value[4] = 1;
   foo_2.Bar<char, 7>::value[1] = 'x';

下面是一個完整的編譯示例

#include <array>

template <typename T, std::size_t N>
struct Bar
 { std::array<T, N>  value; };

template <typename...>
struct Foo;

template <typename ... Ts, std::size_t ... Ns>
struct Foo<Bar<Ts, Ns>...> : public Bar<Ts, Ns>...
 {
 };

int main ()
 {
   Foo<Bar<int, 5>, Bar<double, 7>> foo_1;
   Foo<Bar<char, 7>> foo_2;

   foo_1.Bar<int, 5>::value[4] = 1;
   foo_2.Bar<char, 7>::value[1] = 'x';
 }

您可以將數組類型作為類型名傳遞,您的示例將變為:

Foo<std::array<int, 5>, std::array<double, 7> > foo_1(
    std::array<int, 5>{0,0,0,0,0},
    std::array<double, 7>{0,0,0,0,0,0,0});

foo_1.Foo<std::array<int, 5>>::value[4] = 1;

暫無
暫無

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

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