我有一些小型的仅标头库(仅标头部分很重要)。在最初的版本中,我在其中定义的类中有一些静态成员。直到后来(当我在一个更大的项目中使用它们时)我才意识到静态成员会违反 ODR。我想让它们只保留标题,因此在单独的 .cpp 文件中定义静态成员是不可能的。一个众所周知的解决方案是为每个静态成员使用Meyers 单例函数局部静态变量(如建议的那样,例如,here)。
这一切都很好,但是由于我希望单例的行为类似于成员变量,因此我希望能够使用 setter 和 getter 获取和设置值。但是Meyers 单例函数局部静态变量的 getter 和 setter 是什么样的呢?我一直无法找到解决该特定问题的任何方法。
为了澄清,这些是要求:
- 我想要一个仅标头库中的静态成员变量的行为(所以我不能将定义放在 .cpp 文件中)
- 我想要一个 getter,它只是一个getter(我不应该通过分配给 getter 返回的引用 来修改值)
- 我还希望能够通过专用的setter修改值。
编辑1:
我想解释一下为什么你可能需要这个。
我提到的库中的静态变量定义了一些参数的默认值。但是,我不想硬编码这些默认值,而是让用户可以在程序开始时设置默认值,这样他们就不必在每次调用成员函数或构造一个成员函数时手动传递值新实例。
此外,虽然我同意在此处提供的示例中使用术语“Meyers singleton”具有误导性(我只是使用一个int
值),但没有什么能阻止您将此范例与您只想要一个的自定义类一起使用的实例。在这种情况下,“Meyers singleton”一词将是合理的。
编辑2:
这与在 C++17 中引入变量有些无关inline static
,但我将把它留给没有选择使用 C++17 的人。