c++ - 有没有办法在不破坏封装的情况下为模板类(所有类型)使用一个静态变量

标签 c++ templates static

我需要一种方法来为我的模板类的所有类型设置一个静态变量

template <class T> class Foo { static Bar foobar;};

好吧,上面的行将为每种类型生成一个名为 foobar 的 Bar 对象 T ,但这不是我想要的,我基本上想要一种方法来声明 Bar 类型的变量,所以每个类型的对象 Foo可以访问相同的 foobar变量,独立于T .

我尝试使用另一个类来存储私有(private)内容,但这不起作用,因为标准不允许类似 template <class T> friend class Foo<T>; 的内容

所以显而易见的解决方案(如下所示)是拥有一个全局变量 Bar foobar ,但这显然违反了信息隐藏概念(适当封装):

Bar Foo_DO_NOT_TOUCH_THIS_PLEASE_foobar;
template <class T> class Foo { static Bar& foobar;};
template <class T> Bar& Foo<T>::foobar=Foo_DO_NOT_TOUCH_THIS_PLEASE_foobar;

当然,您还可以使用 detail 命名空间(这就是我目前正在做的),但是还有另一种方法可以真正禁止用户乱用您的私有(private)静态变量吗?

此外,当您必须以类似的方式声明大量静态方法时,此解决方案会变得非常困惑,因为您很可能不得不广泛使用 friend 关键字,如 friend RetType Foo_detail::StaticFunc(ArgT1, ArgT2) .

而且用户不会有一个漂亮的界面,因为他们不能像以前那样使用这些功能 Foo<T>::someFunc()但他们将不得不调用类似 Foo_static::someFunc() 的东西(如果您将命名空间 Foo_static 用于公共(public)静态函数)。

那么有没有不破坏封装和/或不引入大量语法开销的其他解决方案?

编辑: 根据您的所有回答,我尝试了以下操作,它按预期工作:

typedef int Bar;
template <class T> class Foo;

class FooBase
{
    static Bar foobar;
    public:
        template <class T> friend class Foo;
};
Bar FooBase::foobar;

template <class T> class Foo : public FooBase
{
    public:
    using FooBase::foobar;
};

此解决方案的好处是,用户无法从 FooBase 继承。

最佳答案

也许继承静态成员?

class OneBarForAll
{
protected:
  static Bar foobar;
};

template <class T>
class Foo : public OneBarForAll
{

};

很多Foo<T>将制作,但只有一个 OneBarForAll .

一个潜在的问题是没有什么可以阻止代码的其他用户继承自 OneBarForAll并修改 foobar无论如何。

理想情况下,您确实需要模板 friend ,因为它最能描述您设计的访问要求,但 C++ 目前不允许这样做。

关于c++ - 有没有办法在不破坏封装的情况下为模板类(所有类型)使用一个静态变量,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2246259/

相关文章:

c++ - 通过给定点的最小线数

c++ - vs 2012 的 opencv 3.0 链接器问题

c++ - 为 STL 容器传递模板化迭代器

node.js - Express/Node/Cloud9 - 提供静态文件的问题

c++ - 如何查找给定应用程序是否为单实例?

C++从编译时多态性中隐藏模板习语

python - django 在模板中显示上下文数据而不通过 url 调用 View

c++ - 如何在 C++ 中强制包含静态库中的静态对象 (MSVC 11)

C++ 在类中声明一个静态对象

C++ - 为离线 VS2013 加载 Microsoft 符号