我想知道是否有人开发了一次性变量的概念。也就是说,一个变量可能有一些默认值,但在程序执行期间只能设置一次。注意,这与任何类型的常量都不同,因为常量是在程序执行之前设置的。
答案 0 :(得分:4)
此处没有预先打包的解决方案,但由于我们现在有once_flag
,我们可以编写一个过度杀伤解决方案,确保您只能拨打operator=
一次:
template <typename T>
class SetOnce
{
public:
SetOnce(T const& v)
: val(v)
{ }
SetOnce& operator=(T const& v) {
std::call_once(flag, [=]{
val = v;
});
return *this;
}
T get() const { return val; }
private:
std::once_flag flag;
T val;
};
int main() {
SetOnce<int> so(4);
std::cout << so.get() << '\n'; // 4
so = 5;
std::cout << so.get() << '\n'; // 5
so = 6;
std::cout << so.get() << '\n'; // still 5
}
不确定你对这样的事情做了什么,但C ++ 11肯定很酷。
答案 1 :(得分:1)
C或C ++本身不存在此类构造。
答案 2 :(得分:1)
C ++引用就是这样做的。
参考变量,例如T & ref
,只能被绑定一次(但在运行时,对任何东西)。之后,指针表达式&ref
实际上是一个常量,语言规则不允许它更改。
答案 3 :(得分:1)
也许可以使用一对函数来实现 set-once变量。
#include <assert.h>
#include <stdlib.h>
#define set_once_default 7
typedef struct set_once_S set_once_T;
set_once_T *value = NULL;
int set_once_read(set_once_T *ptr) {
if (ptr == NULL) return set_once_default;
return *((int *) ptr);
}
void set_once_write(set_once_T *ptr, int value) {
if (ptr == NULL) {
ptr = malloc(sizeof value);
assert(ptr);
*((int *) ptr) = value;
}
}
如果需要非全局set_once_T
,则代码需要free()
,因为它超出了范围。