Я хотел бы создать шаблон класса RestrictedInteger
, который может быть создан только с определенными значениями, известными во время компиляции.Вот как я мог бы сделать это вручную:
// Wrapper
template<int... Is> using IntList = std::integer_sequence<int, Is...>;
// This is my class
template<class intList> class RestrictedInteger;
template<int I1>
class RestrictedInteger<IntList<I1>> {
const int _i;
public:
constexpr RestrictedInteger(std::integral_constant<int, I1>) : _i(I1) {}
};
//[...]
template<int I1, I2, I3>
class RestrictedInteger<IntList<I1, I2, I3>> {
const int _i;
public:
constexpr RestrictedInteger(std::integral_constant<int, I1>) : _i(I1) {}
constexpr RestrictedInteger(std::integral_constant<int, I2>) : _i(I2) {}
constexpr RestrictedInteger(std::integral_constant<int, I3>) : _i(I3) {}
};
//[...] (and so on)
Естественно, я бы вместо этого хотел использовать шаблон с переменным числом аргументов. Если бы только это было законно :
template<int... Is>
class RestrictedInteger<IntList<Is...>> {
int _i;
public:
constexpr RestrictedInteger(std::integral_constant<int, Is>) : _i(Is) {}... // ERROR
}
Поскольку я использую C ++ 17, я думал, что это будет работать так:по-видимому, нет.
Есть идеи, как изящно решить эту проблему?