Как упростить структуры, используя шаблон? - PullRequest
2 голосов
/ 29 ноября 2011

У меня есть фрагмент кода, скопированный ниже, с действительно похожими структурами, в которых только один член меняет тип.Я ищу, чтобы упростить это.Я думал об использовании шаблона, но я не слишком уверен, как бы это было синтаксис между структурой и шаблоном.Любой указатель будет принята с благодарностью.


typedef struct pos_parameter{
    float magnitud;
    bool new_value;
} pos_parameter;

typedef struct feed_parameter{
    double magnitud;
    bool new_value;
} feed_parameter;

typedef struct speed_parameter{
    long magnitud;
    bool new_value;
} speed_parameter;

typedef struct g_code_parameter{
    int magnitud;
    bool new_value;
} g_code_parameter;

typedef struct position{
    pos_parameter X;
    pos_parameter Y;
    pos_parameter Z;
    pos_parameter A;
} position;

typedef struct move{
    position pos;
    feed_parameter feedrate;
    speed_parameter speed;
    g_code_parameter g_code;
} move;

Ответы [ 4 ]

3 голосов
/ 29 ноября 2011
template <typename T>
struct parameter{
    T magnitud;
    bool new_value;
};

Пример использования:

parameter<float> pos_parameter;
parameter<double> feed_parameter;
parameter<long> speed_parameter;
parameter<int> code_parameter;

Надеюсь, это поможет.

2 голосов
/ 29 ноября 2011

Одно быстрое наблюдение, прежде чем мы приступим к обобщению переменной-члена 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()
{
}
2 голосов
/ 29 ноября 2011

Я думаю, первые четыре могут быть:

template<typename T>
struct pos_parameter{
    T magnitud;
    bool new_value;
};
1 голос
/ 29 ноября 2011
template<typename T>
struct generic_parameter
{
    T magnitud;
    bool new_value;
};

Вот, пожалуйста,

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...