我需要一种方法来为我的模板类的所有类型设置一个静态变量
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/