Кто-то порекомендовал параметр конструктора, который я второй.Но вы все равно можете сделать это как изначально
struct CircValRange
{
double a,b; // range: [a,b)
};
template <CircValRange const& Range>
class CircVal
{
// todo
};
extern const CircValRange SignedDegRange= {-180., 180.};
CircVal<SignedDegRange> x;
Но обратите внимание, что свойство, определяющее идентификацию типа CircVal<SignedDegRange>
, равно , а не значению SignedDegRange
, но адрес / его личность.То есть следующее не работает, потому что CircVal<SignedDegRange1>
обозначает другой тип
extern const CircValRange SignedDegRange1 = {-180., 180.};
CircVal<SignedDegRange1> y = x; // error!
Как таковое, перечисление может лучше подходить для этого
enum RangeKind {
SignedDegRange,
UnsignedDegRange
};
const CircValRange Ranges[] = { { -180., -180. }, { 0., 360. } };
template <RangeKind Range>
class CircVal
{
// todo
};
Или даже класса чертсо статическими функциями-членами, похожими на решение, которое кто-то другой имел
template <typename Range>
class CircVal
{
// todo
};
struct SignedDegRange {
static double min() { return -180.; }
static double max() { return 180.; }
};
CircVal<SignedDegRange> x;