[問題] c++ macro簡化static_cast?

作者: grayStone (灰色石頭)   2016-07-25 00:09:48
開發平台(Platform): (Ex: VC++, GCC, Linux, ...)
ubuntu gcc c++11
問題(Question):
寫類神經網路的時候時常要把層轉型
想問把cast寫成macro會不會太偷懶
或是有更好的做法
*[36m程式碼(Code):(請善用置底文網頁, 記得排版) *[m
//定義
class BaseLayer{};
class InputLayer : public BaseLayer{};
class HiddenLayer : public BaseLayer{};
class OutputLayer : public BaseLayer{};
//把層轉成Base存在vector
std::vector<BaseLayer*> Network;
Network.push_back(new InputLayer(args) );
Network.push_back(new HiddenLayer(args) );
Network.push_back(new OutputLayer(args) );
//要調用的時候就得
static_cast<InputLayer*>(Network[0])->input = GetInput();
static_cast<HiddenLayer*>(Network[1])->DoSomething;
static_cast<OutputLayer*>(Network.back())->output;
現在打算定義macro 讓事情簡單一點
#define GET_INPUT( x ) static_cast<InputLayer*>( (x)[0] )
#define GET_HIDDEN( x , i ) static_cast<HiddenLayer*>( (x)[(i)] )
#define GET_OUTPUT( x ) static_cast<OutputLayer*>( (x).back() )
這樣調用只需要,看起來也比較清楚
GET_INPUT( Network )->DoSomething;
...
而且本來Network也不只是個vector
實際用起來會在多一層 比較難看
補充說明(Supplement):
c++11 以上的方法也可以
作者: Caesar08 (Caesar)   2016-07-25 00:54:00
你確定你很清楚,繼承、virtual function這些東西嗎?另外,依照你現在貼的code,用unique_ptr會好很多
作者: ilikekotomi (Young)   2016-07-25 01:07:00
BaseLayer加個DoSomething的Pure virtual function之後再override BaseLayer的DoSomething就不用轉型了
作者: Caesar08 (Caesar)   2016-07-25 01:11:00
那這樣你應該先去讀一下什麼是virtual functionunique_ptr跟raw pointer效能一樣(shared_ptr就不是)你用virtual function所降低的效能還比較大不過virtual function的效能影響也很低就是了啦
作者: ilikekotomi (Young)   2016-07-25 01:26:00
Sorry 沒看仔細 DoSomething直覺是function
作者: yoco (眠月)   2016-07-25 01:51:00
唸一下什麼是 virtual function,可以解決你的問題然後你都要算神經網路了,效能瓶頸不會在 smart ptr 這邊
作者: steve1012 (steve)   2016-07-25 06:08:00
Virtual 不是就直接解決了嗎 你知道啥是多型嗎
作者: hylkevin (19s)   2016-08-02 00:51:00
要用dynamic_cast才對 不然資料怎麼錯的你都不知道

Links booklink

Contact Us: admin [ a t ] ucptt.com