gpt4 book ai didi

c++ - 我可以确保在编译期间只创建一次对象吗?

转载 作者:搜寻专家 更新时间:2023-10-31 02:02:40 25 4
gpt4 key购买 nike

通过断言在编译时创建一次对象避免运行时出现问题,避免使用动态对象

让我们假设有一些硬件资源不能被一个应用程序的两个模块使用。让我们说别针。有不同的硬件配置和不同的构建完成 - 确保一个硬件资源(如最简单情况下的引脚)仅使用一次并且不在运行时检查它会很棒。

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

然后我可以创建

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

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

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

关于c++ - 我可以确保在编译期间只创建一次对象吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56947095/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com