У меня есть несколько классов, которые выглядят так:
struct neg_inf {
constexpr double operator()() { return -std::numeric_limits<double>::infinity(); }
};
struct pos_inf {
constexpr double operator()() { return std::numeric_limits<double>::infinity(); }
};
template<typename dX, class LowerBound, class UpperBound>
class limit {
dX dx;
UpperBound upperBound;
LowerBound lowerBound;
double step_size;
limit( dX x, LowerBound lower, UpperBound upper, double step = 1 ) :
dx{ x }, lowerBound{ lower }, upperBound{ upper }, step_size{ step }
{}
dX value() const { return dx; }
LowerBound lower() const { return lowerBound; }
UpperBound upper() const { return upperBound; }
double step() const { return step_size; }
};
Эти классы пока работают, как задумано.Теперь я хочу изменить аргументы шаблона, используя такие условия, как std::enable_if_t
, std::is_arithemtic
std::is_same
.
Это условия, которые необходимо выполнить для создания экземпляра объекта ограничения.
dX
должно быть не менее arithmetic
и numerical
Lower
& Upper
bound
должно быть либо numerical
, arithmetic
или neg_inf
, либо pos_inf
.
Например, это допустимые экземпляры:
dX = 1st and can be any: int, long, float, double, /*complex*/, etc.
limit< 1st, 1st, 1st > // default template
limit< 1st, 1st, pos_inf > // these will be specializations
limit< 1st, 1st, neg_inf >
limit< 1st, pos_inf, 1st >
limit< 1st, neg_inf, 1st >
limit< 1st, pos_inf, pos_inf >
limit< 1st, neg_inf, neg_inf >
limit< 1st, neg_inf, pos_inf >
limit< 1st, pos_inf, neg_inf >
Это действительные условия для создания экземпляра моего шаблона.Я планирую частично специализировать этот класс, когда один или оба UpperBound
и или LowerBound
имеют тип infinity
.Когда границы upper
и lower
являются числово-арифметическими типами, шаблон общего или стандартного формата будет обрабатывать их.
Мой вопрос заключается в том, как будет выглядеть template declaration
для моего класса с type_traits
библиотека