5

私はちょうど使い方を学んでいてstd::variant、(原則として)任意の多くのユーザー定義型で構成される型リストを宣言したいと思います。つまり、次のようなもの

template<typename T>
struct MyType{
    T x;
};

template<typename T, int N>
MyClass{
public:
    MyType<T> y;
    int z = N;
    double w;
    MyClass(double b){
        w = b;
    }
};

template<typename T>
using my_type_list = std::variant<
    MyClass<T,1>, MyClass<T,289>, MyClass<T,13>, ...., MyClass<T,5001>
>;

template<typename T>
std::vector<my_type_list> my_big_list = {
    MyClass<T,1> { 2.0 },
    MyClass<T,1> { 3.0 },
    MyClass<T,289> { 9.4 },
    MyClass<T, 13> { 1.3 },
    MyClass<T, 5001> {2.5},
    MyClass<T, 5001> {3.2},
    ..... etc....
};

ただし、整数Nは原則として何でもかまいません。

これが可能な方法はありますか?

4

2 に答える 2

1

バリアントの値の数を指定するために、別のテンプレート パラメーターを使用することを検討していることを示しました。その場合、それを使用してstd::integer_sequenceを構築し、それを使用してバリアント型リストを作成するのは簡単なことです。

#include <variant>
#include <type_traits>
#include <utility>

template<typename T>
struct MyType{
    T x;
};

template<typename T, int N>
class MyClass{
    MyType<T> y;
    int z = N;
};

template<typename T, typename sequence> struct my_type_helper;

template<typename T, int ...N>
struct my_type_helper<T, std::integer_sequence<int, N...>> {

    typedef std::variant<MyClass<T, N>...> variant_t;
};

template<typename T, int N>
using my_type=
    typename my_type_helper<T, std::make_integer_sequence<int, N>>::variant_t;

static_assert(std::is_same_v<std::variant<MyClass<int, 0>,
          MyClass<int, 1>,
          MyClass<int, 2>>,

          my_type<int, 3>>);

はと同等でstatic_assertあることを証明します。my_type<int, 3>std::variant<MyClass<int, 0>, MyClass<int, 1>, MyClass<int, 2>>

PSint z = N;おそらくそうあるべきconstexpr int z=N;です。

于 2021-03-14T17:17:17.987 に答える
1

を使用std::index_sequenceしてコンパイル時のインデックスのシーケンスを作成し、それを使用しstd::variantてそれらのインデックスを非型テンプレート パラメーターの可変個パックとして作成できます。

template<typename T, std::size_t ...Is>
auto my_type_list_impl(std::index_sequence<Is...>) 
  -> std::variant<MyClass<T, Is + 1>...>;  // no definition needed, we just need the return type

template<typename T, int N>
using my_type_list 
  = decltype(my_type_list_impl<T>(std::make_index_sequence<N>{}));

ここにデモがあります

于 2021-03-14T17:19:48.207 に答える