模板类的单个静态变量的不同方法

时间:2010-02-11 19:37:56

标签: c++ templates static

我从来没有真正需要模板中的全局变量(实际上我不支持这样的设计)但是topic这让我很好奇。

即使回答,它也激发了我尝试不同的方法。我没有使用继承,而是想出了这个:

class Bar {};

class {
private:
    Bar bar;
    template <class T> friend class Foo;
} static foobar_singleton;

template <class T> 
class Foo 
{ 
public:
    static Bar bar() { return foobar_singleton.bar; }
};

对我来说,foobar_singleton与'非成员静态私有'的工作方式类似,因为其内容只能由模板类Foo访问。它也避免了继承虽然我不确定这实际上是一个优势。我的解决方案似乎可能只包含头文件,而不需要另一个定义文件。

我想看看这个方法的意见是什么,与那个让我好奇的线程的答案相比。例如,我想听到的一些问题的例子:

1。你看到我的例子中有任何明显的优势吗?或者就此而言,明确的不满意? 2。您是否建议将bar属性设为静态成员并命名用作单例的类? 3. 这会让任何人想起任何设计模式?类似于pimpl成语可能吗?
4. 您看到任何编译器可移植性问题? (我只用MSVC和GCC进行了测试)
5. 我是一个可能的仅限标题的实现?我实际上并不完全确定静态变量foobar_singleton

提前致谢!

1 个答案:

答案 0 :(得分:2)

示例中的静态变量foobar_singleton将是每个翻译单元中的不同变量(内部链接!)。这是一种表演者。

原始主题中的继承仅用于将公共静态变量“注入”到模板的命名空间中。如果这不是一个要求,只是不要从FooBase派生Foo,也可以这样做 如果由于某种原因需要它,我会私下派生,这应该消除引入额外基类可能遇到的任何可能的副作用。当然,如果Foo继承了其他类,那么将helper-class添加为最后一个基类。

如果您想要一个仅限标题的解决方案:

typedef int Bar;


template <class DummyType>
class FooCommonStatics
{
    static Bar s_bar;

    template <class T>
    friend class Foo;
};

template <class DummyType>
Bar FooCommonStatics<DummyType>::s_bar;

template <class T>
class Foo
{
public:
    // void is just a dummy-type, any type that's not dependent on T would do
    typedef FooCommonStatics<void> CommonStatics;

    Foo()
    {
        CommonStatics::s_bar++;
    }

private:
    T m_something;
};