成员函数中静态变量的替代项

An alternative to a static variable in a member function

本文关键字:变量 函数 静态 成员      更新时间:2023-10-16

我一直认为成员函数中定义的静态变量仅限于特定的类实例。

为了说明我的误解:

#include <iostream>
#include <string>
struct Simple {
    template<typename T>
    T & Test(const T & Value) {
        static T Storage = Value;
        return Storage;
    }
};
int main() {
    Simple A;
    Simple B;
    std::string Foo = A.Test(std::string("Foo"));
    std::string Bar = B.Test(std::string("Bar"));
    std::cout << Foo << ' ' << Bar << std::endl;
}

我预期的行为会导致的输出

Foo Bar

有没有一个简单的替代方案会导致我预期的行为?

编辑

出现问题的类的精简版:

class SignalManager {
    private:
        template<typename T> struct FunctionPointer { typedef boost::function1<void, const T &> type; };
        template<typename T> struct Array { typedef std::vector<typename FunctionPointer<T>::type> type; };
        template<typename T>
        typename Array<T>::type & GetArray() {
            static typename Array<T>::type Array;
            return Array;
        }
    public:
        template<typename T, typename M>
        void Broadcast(const M & Value) {
            typename Array<T>::type::iterator Iterator;
            for(Iterator = GetArray<T>().begin(); Iterator != GetArray<T>().end(); ++Iterator) {
                (*Iterator)(Value);
            }
        }
        template<typename T, typename F>
        void Connect(const F & Function) {
            GetArray<T>().push_back(Function);
        }
};

如果我理解您的困惑,另一种选择是成员变量。。。

template<typename T>
struct Simple {
    T storage;
    T & Test(const T & Value) {
        storage = Value;
        return Storage;
    }
};
static T Storage = Value;

尽管多次调用成员函数Test,但上述语句只执行一次。因此,请将声明和初始化分开。

template<typename T>
T & Test(const T & Value) {         
     static T Storage;
     Storage = Value;   // Now, this is guaranteed to execute during member function calls.
    return Storage;
}

这应该会得到你想要的。

您可以将它变成一个常规的、非静态的类变量,尽管这需要类作为模板而不是函数。。。

template<typename T>
struct Simple
{
    T& Test( const T& value )
    {
        storage = value;
        return storage;
    }
private:
    T storage;
}