如何使用模板简化结构?

时间:2011-11-29 17:10:15

标签: c++ templates struct

我有一段代码,在下面复制,有一些非常相似的结构,其中只有一个成员改变了类型。我希望简化它。我正在考虑使用模板,但我不太确定结构和模板之间的语法是什么。任何指针都将非常感激。


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 个答案:

答案 0 :(得分:3)

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;

希望有所帮助。

答案 1 :(得分:2)

我猜前四个可能是:

template<typename T>
struct pos_parameter{
    T magnitud;
    bool new_value;
};

答案 2 :(得分:2)

在我们开始对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;

您还可以使用typedefbasic_parameter的certian专精创建一种“别名”,如下所示:

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>

您可以使用此技术为typedefposition结构中使用的所有不同类型的参数创建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()
{
}

答案 3 :(得分:1)

template<typename T>
struct generic_parameter
{
    T magnitud;
    bool new_value;
};

你去了