2011-11-29 105 views
2

我有一段代碼,複製如下,其中只有一個成員更改類型的結構非常類似。我正在尋求簡化它。我正在考慮使用模板,但我不太確定結構和模板之間的語法如何。任何指針將不勝感激。如何使用模板簡化結構?


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; 

回答

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; 

你也可以使用一個typedef創造certian專修一類的「別名」的basic_parameter ations,像這樣:

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> 

您可以使用此技術來爲所有不同類型的你正在使用的positionmove結構參數創建typedef s,而讓這個你不必更改這些類型的代碼。

這裏是一個完整的解決方案:

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

我想前四可能是:

template<typename T> 
struct pos_parameter{ 
    T magnitud; 
    bool new_value; 
}; 
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
template<typename T> 
struct generic_parameter 
{ 
    T magnitud; 
    bool new_value; 
}; 

你去那裏