我可以确保在编译时只创建一次对象吗?
Can I ensure object created only once during compile time?
通过断言在编译时创建一次的对象来避免运行时出现问题,并避免动态对象
假设有许多硬件资源不能被应用的两个模块使用。让我们说别针。有不同的硬件配置和不同的构建 - 确保一个硬件资源(如最简单的引脚(只使用一次而不在运行时检查它会很棒。
template <uint8_t pin>
struct Pin {
static constexpr uint8_t Number = pin;
/*.... */
}
然后我可以创建
Pin<1> pin1;
Pin<2> pin2;
我想知道当我再次声明相同的引脚时,我是否会得到编译错误/断言:
Pin<2> pin2duplicate;
是的,可以保证只有一个实例处理引脚的数据表示,也可以为一个应用程序提供多个转换单元。
想法:将模板类的所有数据成员设置为静态。因此,所有成员在所有实例中都是相同的。这应该会导致预期的行为。由于每个类型(每个模板实例都是一个类型(都有自己的数据,因此您可以有多个引脚,每个引脚都有自己的一组数据。
例:
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.
}
相关文章:
- 有没有办法一次声明相同类型的多个对象,并通过一个表达式立即使用相同的右值初始化它们?
- 具有相同特征的两个对象是否只在内存中存储一次?无论定义它们的函数是什么,都是不同的
- 循环中本地对象的析构函数是否保证在下一次迭代之前被调用?
- (2 问题)"类"类型重新定义(即使 #pragma 一次),以及静态函数内的静态成员对象初始化?
- 每 200 帧替换一次对象
- 我应该只在免费商店上为一次调用创建对象吗?
- 我可以确保在编译时只创建一次对象吗?
- 我如何仅一次或一次创建一个对象
- 在循环中声明的对象是否只构造一次
- 如何确保方法在该对象的生存期内仅执行一次?
- 每隔几秒钟移动一次对象
- 如果我确定只有一个线程一次处理指针/对象,则C/C 仍应使用同步
- 只为NOT STATIC类的EACH对象调用一次方法
- 通过调用一次新运算符大容量分配对象
- 在一个文件中循环一次,将行读取到添加到数组中的对象中
- 如何在 Windows11(x7) 上使用 EPM 一次将 64 个浏览器帮助程序对象 dll 注册到 IE7 中
- 应该多久打开/关闭一次 fstream 对象 c++
- 如何使用C++单一实例返回仅初始化一次的对象
- OpenGl 使对象每 N 秒"jump"一次
- 一次对所有对象执行一个函数(没有for循环)