gpt4 book ai didi

c++ - 在对象中传递函数和运算符调用

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

我想创建一个类,它允许我锁定对象以防止被修改。它本质上是一个带有指定锁定状态的 bool 值的模板。由于是模板,我不会知道所有可以在内部对象上调用的方法,所以我需要一个方法来传递调用...

template<class T>
class const_lock
{
public:
const_lock() : my_lock(false) {}
void set_const_lock(bool state) {my_lock = state;}

// HOW TO IMPLEMENT SOMETHING LIKE THESE????
//
template<typename...Args >
auto operatorANY_OPERATOR (Args...args)
{
if(my_lock != false)
throw std::exception("Objected locked to modification");
return my_value.ANY_OPERATOR(args);
}

template<typename...Args >
auto operatorANY_CONST_OPERATOR (Args...args) const
{
return my_value.ANY_CONST_OPERATOR(args);
}

template<typename...Args >
auto ANY_METHOD(Args...args)
{
if(my_lock != false)
throw std::exception("Objected locked to modification");
return my_value.ANY_METHOD(args);
}

template<typename...Args >
auto ANY_CONST_METHOD(Args...args) const
{
return my_value.ANY_CONST_METHOD(args);
}

private:
bool my_lock;
T my_value;
}

int main()
{
const_lock<std::vector<int>> v;
v.push_back(5);
v.push_back(7);
v.set_const_lock(true);
v.push_back(9); // fails compilation
std::cout << v.at(1) << std::endl; // ok
}

如有任何帮助,我们将不胜感激。谢谢!

编辑:将静态断言更改为抛出和异常

最佳答案

您尝试做的事情看起来相当困难,但更重要的是,对于您尝试做的事情来说过于复杂且不必要。

本质上,您要尝试做的(如果我错了请纠正我)是创建一个编译时检查,检查您是否应该能够在给定时间修改对象。然而,c++ 已经有一个内置的方法来做到这一点。只需将您的对象声明或传递为 const 或 const&,编译器将不允许您修改对象的非可变部分。当您希望能够修改它时,请在不使用 const 的情况下传递它。您甚至可以将它从 const& 转换为常规 & 当您想从无法直接修改它的代码转到可以直接修改的代码时,尽管我不推荐这样做。

编辑:刚刚看到关于没有引用数组的问题的评论。别担心!标准库支持引用包装器,它允许您实质上将引用存储在数组或其他任何地方。

关于c++ - 在对象中传递函数和运算符调用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32570524/

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