バリアントまたはタプルをインスタンス化するために使用できるように、型特性のインデックス付きセットからテンプレート パックを生成することは可能ですか?
#include <variant>
template<int n>
struct IntToType;
template<>
struct IntToType<0>
{
using type = int;
static constexpr char const* name = "int";
// Other compile-time metadata
};
template<>
struct IntToType<1>
{
using type = double;
static constexpr char const* name = "double";
// Other compile-time metadata
};
using MyVariant = std::variant<IntToType<???>::type...>; // something with make_integer_sequence and fold expression?
または、代わりにバリアントを入力として使用する必要があります:
#include <variant>
using MyVariant = std::variant<int, double>;
template<int n>
struct IntToTypeBase
{
using type = std::variant_alternative_t<n, MyVariant>;
};
template<int >
struct IntToType;
template<>
struct IntToType<0>:IntToTypeBase<0>
{
static constexpr char const* name = "int";
// Other compile-time metadata
};
template<>
struct IntToType<1>:IntToTypeBase<1>
{
static constexpr char const* name = "double";
// Other compile-time metadata
};
またはvariant
、タイプの単純なリストの代わりに特性のセットを受け入れる独自の をロールすることもできます。
template<class IntegerType, template<auto> class Traits, size_t LastIndex>
class Variant;