[问题] 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