是否存在set-once变量的概念?

时间:2015-08-24 21:41:56

标签: theory solid-principles

我想知道是否有人开发了一次性变量的概念。也就是说,一个变量可能有一些默认值,但在程序执行期间只能设置一次。注意,这与任何类型的常量都不同,因为常量是在程序执行之前设置的。

4 个答案:

答案 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(),因为它超出了范围。