我正在抽象多个微处理器上的中断处理。ARM Cortex M-3 / 4确实非常支持STL,但是ATMega328p(已大量使用)不支持C ++ STL。我仍然想提供使用基本C样式函数指针之外的std::function
注册特定中断的回调的可能性。我还没有测试过,但是被告知与简单函数指针相比,C ++ lambda可以做很多事情,尤其是在捕获变量和引用时。
我想更改定义的标头类(如有必要)和实现的类(如有必要,可能没有必要,因为实现会简单地丢失),以便在编译时删除成员函数定义,具体取决于控制器是否支持STL。我想知道C ++是否提供这样的测试,或者是否可以通过包含STL标头和某种方式的测试来做到这一点,包括是否失败?
...
#include <functional>
class InterruptVectorTable
{
bool setCallback(ValueType InterruptNumber, void (*Callback)(void));
bool setCallback(ValueType InterruptNumber, std::functional<void(void)> Callback);
}
如果两个定义不能同时使用,那么我想最好使用std::function
。
新的C ++ 17标准具有您正在寻找的__has_include功能。但是,这有点像鸡和鸡蛋的问题。如果您的平台不支持STL,则c ++ 17可能已过时。
相反,您可能希望依赖您的构建系统。例如,cmake可以检测到哪个C++ standard a compiler honors或什至实现了标准的哪个部分。
在您的情况下,如果标准lib在该平台上可用,则让构建定义临时预处理器常量HAS_STD_CPP可能更简单,然后使用c预处理器包含或不包含STL位,如图所示在https://en.wikipedia.org/wiki/C_preprocessor中。