![](/img/trans.png)
[英]Is it possible to ensure a constexpr function is called at most once at compile time?
[英]Can I ensure object created only once during compile time?
通过断言在编译时创建的对象并避免动态对象来避免运行时出现问题
让我们假设有许多硬件资源不能被应用程序的两个模块使用。 比如说 Pins。 有不同的硬件配置和不同的构建完成 - 确保一个硬件资源(如最简单情况下的引脚)只使用一次而不在运行时检查它会很棒。
template <uint8_t pin>
struct Pin {
static constexpr uint8_t Number = pin;
/*.... */
}
然后我可以创建
Pin<1> pin1;
Pin<2> pin2;
我想知道当我再次声明相同的 pin 时是否会出现编译错误/断言:
Pin<2> pin2duplicate;
是的,可以保证只有一个实例在处理 pin 的数据表示,也可以为一个应用程序提供多个翻译单元。
想法:将模板类的所有数据成员设为静态。 因此,所有成员在所有情况下都是相同的。 这应该会导致预期的行为。 由于每种类型(并且每个模板实例都是一种类型)都有自己的数据,因此您可以有多个引脚,每个引脚都有自己的一组数据。
例子:
template <uint8_t pin>
struct Pin
{
static constexpr uint8_t Number = pin;
static bool state;
void SetState( bool newState ) { state = newState; }
bool CheckState() const { return state; }
};
template< uint8_t pin >
bool Pin<pin>::state = false;
int main()
{
Pin<1> p1;
Pin<1> p1duplicate;
Pin<2> p2;
std::cout << p1.CheckState() << std::endl;
std::cout << p1duplicate.CheckState() << std::endl;
std::cout << p2.CheckState() << std::endl;
p1.SetState(true);
std::cout << p1.CheckState() << std::endl;
std::cout << p1duplicate.CheckState() << std::endl; // here we have the data also changed in the duplicate
std::cout << p2.CheckState() << std::endl; // as you can see, p2 is not changed as required.
}
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.