sme*_*lin 3 c++ static templates
我需要一种方法来为我的模板类的各种类型提供单个静态变量
template <class T> class Foo { static Bar foobar;};
好吧,上面的行将为每种类型生成一个名为foobar的Bar对象T,但这不是我想要的,我基本上想要一种声明类型为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;
Run Code Online (Sandbox Code Playgroud)
当然,你可以另外使用一个详细命名空间(这就是我目前正在做的事情),但还有另一种方法可以真正禁止用户搞乱你的私有静态变量吗?
另外,当你必须以类似的方式声明许多静态方法时,这个解决方案会变得非常混乱,因为你很可能必须使用friend关键字来扩展friend RetType Foo_detail::StaticFunc(ArgT1, ArgT2).
用户不会有一个很好的界面,因为他们不能像以前那样使用这些功能,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;
};
Run Code Online (Sandbox Code Playgroud)
这个解决方案的好处是,用户不能从FooBase继承.
也许继承静态成员?
class OneBarForAll
{
protected:
static Bar foobar;
};
template <class T>
class Foo : public OneBarForAll
{
};
Run Code Online (Sandbox Code Playgroud)
Foo<T>将会有很多,但只有一个OneBarForAll.
这样做的一个潜在问题是,无论如何都没有阻止代码的其他用户继承OneBarForAll和修改foobar.
理想情况下,您确实需要模板朋友,因为它最能描述您的设计的访问要求,但C++目前不允许这样做.
| 归档时间: |
|
| 查看次数: |
209 次 |
| 最近记录: |