是否存在一次性变量的概念?
Does there exist the concept of set-once variables?
我想知道是否有人提出了一次设置变量的概念。也就是说,一个变量可能有一些默认值,但在程序执行期间只能设置一次。请注意,这不同于任何类型的常量,因为常量是在程序执行之前设置的。
C 或 C++ 中不存在这样的结构。
好吧,C++ 参考资料就是这样做的。
参考变量,例如T & ref
,只能绑定一次(但在 运行 时,可以绑定任何东西)。在那之后,指针表达式 &ref
实际上是一个常量,语言规则不允许它改变。
没有针对此的预打包解决方案,但由于我们现在有 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 确实很酷。
也许可以使用一对函数来影响一个一次性变量。
#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()
它超出范围。
我想知道是否有人提出了一次设置变量的概念。也就是说,一个变量可能有一些默认值,但在程序执行期间只能设置一次。请注意,这不同于任何类型的常量,因为常量是在程序执行之前设置的。
C 或 C++ 中不存在这样的结构。
好吧,C++ 参考资料就是这样做的。
参考变量,例如T & ref
,只能绑定一次(但在 运行 时,可以绑定任何东西)。在那之后,指针表达式 &ref
实际上是一个常量,语言规则不允许它改变。
没有针对此的预打包解决方案,但由于我们现在有 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 确实很酷。
也许可以使用一对函数来影响一个一次性变量。
#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()
它超出范围。