【发布时间】:2017-04-30 19:34:45
【问题描述】:
我想为 ARM 32 位微控制器编写代码,并且想使用现代 C++ 进行教育。我的目标是:可读的代码,在编译时可配置,并帮助编译器生成最大的大小和速度优化。我应该使用什么语言工具来归档我的目标? 我写了一些代码,静态断言不起作用...请帮我修复这段代码(添加断言并且没有开销)。
#include <initializer_list>
#include <vector>
typedef uint port_type;
typedef uint pin_type;
class Pin {
private:
const port_type _port;
const pin_type _pin;
public:
Pin(const port_type port, const pin_type pin) :
_port(port), _pin(pin) {
}
};
class Actuator {
private:
const Pin _enable_pin;
const Pin _dir_pin;
const Pin _step_pin;
public:
Actuator(const Pin enable_pin, const Pin dir_pin, const Pin step_pin) :
_enable_pin(enable_pin), _dir_pin(dir_pin), _step_pin(step_pin) {
}
};
class Machine {
private:
const std::vector<Actuator> _actuators;
public:
Machine(const std::initializer_list<Actuator> actuators) :
_actuators(actuators) {
/*check: all actuators _enable_pin ports are same*/
/*check: all actuators _dir_pin ports are same*/
/*check: all actuators _step_pin ports are same*/
/*check: all port/pin pairs are unique*/
}
};
int main() {
/*example: good sequence*/
Actuator act1(Pin(1, 1), Pin(1, 2), Pin(1, 3));
Actuator act2(Pin(1, 4), Pin(1, 5), Pin(1, 6));
Machine machine1( { act1, act2 });
/*example: bad sequence*/
Actuator act3(Pin(2, 1), Pin(2, 2), Pin(2, 2)); // NOK! Pin(2,2) already used!
Actuator act4(Pin(2, 1), Pin(2, 3), Pin(2, 4)); // NOK! Pin(2,1) already used in act3!
Machine machine2( { act3, act4 });
}
【问题讨论】:
-
个人使用
enable_if而不是static_assert。原因很简单,您可以默认为“无法实例化错误”,而不是将其放入模板中然后编译失败(您会得到不匹配的替换错误和无数次失败)。
标签: c++ c++11 c++14 compile-time static-assert