[問題] c++ macro簡化static_cast?
開發平台(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 以上的方法也可以
--
※ 發信站: 批踢踢實業坊(ptt.cc), 來自: 61.227.156.4
※ 文章網址: https://www.ptt.cc/bbs/C_and_CPP/M.1469376591.A.71E.html
→
07/25 00:54, , 1F
07/25 00:54, 1F
我現在把virtual function 理解成function pointer,
繼承像是結構包結構,只是調用function的時候會根據type轉換this
我在base裡面只有解構是virtual 其實寫的有點抖,沒很確定理解有沒有錯
→
07/25 00:56, , 2F
07/25 00:56, 2F
※ 編輯: grayStone (61.227.156.4), 07/25/2016 01:05:01
unique_ptr好像不能直接static_cast成我要的物件
得放棄做一個新的,或是move過去? 主要是擔心效率問題,不然unique_ptr好多了,還不用怕delete錯type
※ 編輯: grayStone (61.227.156.4), 07/25/2016 01:09:36
→
07/25 01:07, , 3F
07/25 01:07, 3F
→
07/25 01:09, , 4F
07/25 01:09, 4F
我大部分需要轉型都是要存取不一樣type自己的成員,而不是DoSomething()
→
07/25 01:11, , 5F
07/25 01:11, 5F
立刻去看
※ 編輯: grayStone (61.227.156.4), 07/25/2016 01:14:16
→
07/25 01:12, , 6F
07/25 01:12, 6F
→
07/25 01:13, , 7F
07/25 01:13, 7F
→
07/25 01:13, , 8F
07/25 01:13, 8F
了解, 查了virtual function 多了查詢vtable的動作
→
07/25 01:26, , 9F
07/25 01:26, 9F
是我該抱歉沒寫清楚,修一下說明
→
07/25 01:51, , 10F
07/25 01:51, 10F
→
07/25 01:52, , 11F
07/25 01:52, 11F
被你這句話打醒,的確效能不會是這裡的問題,
但我是需要存取每層不同的成員才轉型,virtual function可能不能直接解決
現在打算照C大的建議改成unique_ptr
只會多很多類似下面這樣的程式碼
auto i = unique_ptr<InputLayer>( static_cast<InputLayer*>( Network[0].release() ) );
i->input = GetInput();
Nerwork[0] = move( i );
要把東西cast過才能存成員,然後要裝回去,希望除了整個重構以外還有比較直接的方法
※ 編輯: grayStone (61.227.156.4), 07/25/2016 03:35:45
※ 編輯: grayStone (61.227.156.4), 07/25/2016 03:37:02
推
07/25 06:08, , 12F
07/25 06:08, 12F
推
07/25 06:12, , 13F
07/25 06:12, 13F
→
07/25 06:12, , 14F
07/25 06:12, 14F
推
07/25 06:14, , 15F
07/25 06:14, 15F
→
07/25 06:14, , 16F
07/25 06:14, 16F
推
07/25 08:00, , 17F
07/25 08:00, 17F
→
07/25 08:00, , 18F
07/25 08:00, 18F
→
07/25 08:00, , 19F
07/25 08:00, 19F
→
07/25 08:00, , 20F
07/25 08:00, 20F
我的hidden還有output還多繼承了一個計算層,input只是放資料的
class CalcualteLayer : public BaseLayer{};
都放vector目的是
1.存一起看起來比較簡潔
2.層可能會替換算法,例如多一種class OutputLayer_Type2 : public CalculateLayer
都放一起的好處就是我不用修改訓練網路的class,只要轉型成CalculateLayer
然後寫個for去跑訓練就好
整個架構大概是
class base // data member
class calc : public base // virtual calc function , data member
class input : public base
class hidden : public calc // calc function
class output : public calc // calc function , output function, data member
class network{ vector<base*> }; //network training function
或許我需要的是去多看幾本書 design pattern?
※ 編輯: grayStone (1.175.176.116), 07/25/2016 20:46:01
推
07/25 21:38, , 21F
07/25 21:38, 21F
→
07/25 21:38, , 22F
07/25 21:38, 22F
→
08/02 00:51, , 23F
08/02 00:51, 23F