我需要一种方法来对所有种类型我的模板类的单个静态变量有没有办法有一个模板类(所有类型的)一个静态变量不破坏封装
template <class T> class Foo { static Bar foobar;};
好吧,上面这行会为每个类型T
生成一个名为foobar的Bar对象,但这不是我想要的,我基本上想要一种方法来声明Bar类型的变量,因此Foo
类型的每个对象都可以访问相同的foobar
变量,独立于T
。
我试图用另一个类来存储私人的东西,但是,这并不工作,因为标准不容许这样的东西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;
Ofcourse,你还可以使用一个详细的命名空间(这就是我目前在做什么),但有其真正禁止用户乱搞的另一种方式与你的私人静态变量?
此外,当您必须以类似的方式声明大量静态方法时,此解决方案会变得非常混乱,因为您很可能必须全面使用像friend RetType Foo_detail::StaticFunc(ArgT1, ArgT2)
这样的friend关键字。
而且用户不会有一个漂亮的界面,因为他们不能使用像它们被用来Foo<T>::someFunc()
这些功能,而是他们将不得不调用像Foo_static::someFunc()
(如果你使用的命名空间Foo_static
公共静态函数)。
那么有没有其他的解决方案不打破封装,和/或不会引入大量的语法开销?
编辑: 根据您的所有anwsers,我尝试以下,和它的作品像预期一样:
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继承。
你可以声明一个不相关的类是一个朋友,而不是这个语法。通过@rmn – 2010-02-11 18:01:37