Одно быстрое наблюдение, прежде чем мы приступим к обобщению переменной-члена magnitud
.Использование синтаксиса typedef struct {/*...*/} name;
не требуется и очень не идиоматично в C ++.В C это может быть необходимо, но C ++ - это не C. В C ++ вы можете просто:
struct Gizmo
{
/* ... */
};
Теперь, чтобы обобщить тип переменной-члена magnitud
, вы можете создать классшаблон, подобный этому:
template<class MAG> struct basic_parameter
{
MAG magnitud;
bool new_value;
};
Вы бы объявили экземпляр такой вещи, как это:
basic_parameter<int> myparam;
Вы также можете использовать typedef
для создания своего рода "псевдонима"для специализаций Certian basic_parameter
, например:
typedef basic_param<int> int_param; // Now int_param is shorthand for basic_param<int>
/* ... */
int_param myparam; // myparam is of type basic_param<int>
Вы можете использовать эту технику для создания typedef
s для всех различных типов параметров, которые вы использовали в position
и move
структуры, и сделать так, чтобы вам не нужно было изменять код для этих типов.
Вот полное решение:
template<class MAG> struct basic_parameter
{
MAG magnitud;
bool new_value;
};
typedef basic_parameter<float> pos_parameter;
typedef basic_parameter<double> feed_parameter;
typedef basic_parameter<long> speed_parameter;
typedef basic_parameter<int> g_code_parameter;
struct position {
pos_parameter X;
pos_parameter Y;
pos_parameter Z;
pos_parameter A;
};
struct move
{
position pos;
feed_parameter feedrate;
speed_parameter speed;
g_code_parameter g_code;
};
int main()
{
}