我可以确保在编译期间仅创建一次对象吗?

时间:2019-07-09 07:10:08

标签: c++ embedded c++14

通过断言在编译时创建一次对象来避免运行时问题,并避免动态对象

让我们假设有一定数量的硬件资源无法由一个应用程序的两个模块使用。让说别针。硬件配置不同,构建方式也有所不同-确保一个硬件资源(如最简单的情况下的引脚)仅使用一次而不在运行时进行检查是非常好的。

template <uint8_t pin> 
struct Pin {
    static constexpr uint8_t Number = pin;
    /*.... */
}

然后我可以创建

Pin<1> pin1;
Pin<2> pin2;

我想知道当我再一次声明相同的管脚时是否会出现编译错误/断言:

Pin<2> pin2duplicate;

1 个答案:

答案 0 :(得分:2)

是的,可以保证只有一个实例正在处理引脚的数据表示,并且对于一个应用程序还具有多个转换单元。

想法: 使模板类的所有数据成员都是静态的。因此,所有成员在所有情况下都是 same 。这应该导致预期的行为。由于每个类型(每个模板实例都是一个类型)都有自己的数据,因此可以有多个引脚,每个引脚都有自己的一组数据。

示例:

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.
}