【发布时间】:2020-04-03 13:08:13
【问题描述】:
对于某些任务,如果没有宏,我就无法逃脱。现在我想至少添加一些防止误用的保护。
我想static_assert MYMACRO() 被使用
- 在基类的子类中,...
- ...即在
run()方法中
天真的方法失败了:
static_assert(std::is_base_of<Base, typeid(*this)>::value, "Use MYMACRO() only in subclass of Base.");
// =============
// SubOne would work, but not typeid(*this)
//
static_assert(__func__ == "run", "Use MYMACRO() only in run() method.");
// ========
// not a constexpr?
//
复制:
#ifndef __GNUG__
#error "Needs GCC C++"
#endif
#define MYMACRO() \
{\
do { \
/*> > > want static_assert'ions here < < <*/\
/*here comes stuff I coudn't put into an [inline] function,*/ \
/*because it contains GCC Labels-as-Values and */ \
/*conditional return;*/ \
} while(false);\
}
class Base {
public:
virtual int run() = 0;
};
class SubOne : Base {
public:
int run() override {
// ...
MYMACRO();
// ...
};
};
class SubTwo : Base {
public:
int run() override {
// ...
MYMACRO();
// ...
};
};
int main(void)
{
SubOne sub1;
SubTwo sub2;
//a little embedded app
while (true) {
sub1.run();
sub2.run();
}
}
预测可能的问题:
它是干什么用的? - http://dunkels.com/adam/dunkels06protothreads.pdf
标签作为值:-https://gcc.gnu.org/onlinedocs/gcc/Labels-as-Values.html
为什么不使用上下文切换“正确”RTOS? - 我希望上述解决方案能够简化本机架构下的单元测试,避开对native (POSIX) port 或QEMU/renode 或target board 的需求。 (不是针对所有人,而是针对许多测试)
【问题讨论】:
-
用
decltype获取表达式的类型,而不是typeid。
标签: c++ gcc typetraits static-assert protothread