Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/159.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 成员函数中静态变量的替代方法_C++_Templates_Static - Fatal编程技术网

C++ 成员函数中静态变量的替代方法

C++ 成员函数中静态变量的替代方法,c++,templates,static,C++,Templates,Static,我一直依赖于一种误解,即成员函数中定义的静态变量仅限于特定的类实例 为了说明我的误解: #include <iostream> #include <string> struct Simple { template<typename T> T & Test(const T & Value) { static T Storage = Value; return Storage; } };

我一直依赖于一种误解,即成员函数中定义的静态变量仅限于特定的类实例

为了说明我的误解:

#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;
}
#包括
#包括
结构简单{
模板
T&T测试(常数T&T值){
静态T存储=值;
返回存储;
}
};
int main(){
简单A;
简单B;
std::string Foo=A.Test(std::string(“Foo”);
std::string Bar=B.Test(std::string(“Bar”);

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

template<typename T>
struct Simple {
    T storage;

    T & Test(const T & Value) {
        storage = Value;
        return Storage;
    }
};
模板
结构简单{
T储存;
T&T测试(常数T&T值){
储存=价值;
返回存储;
}
};
尽管多次调用成员函数
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;
}
模板
T&Test(常数T&Value){
静态T存储;
Storage=Value;//现在,这保证在成员函数调用期间执行。
返回存储;
}

这应该可以满足您的需要。

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

template<typename T>
struct Simple
{
    T& Test( const T& value )
    {
        storage = value;
        return storage;
    }
private:
    T storage;
}
模板
结构简单
{
T&T测试(常数T&T值)
{
储存=价值;
返回存储;
}
私人:
T储存;
}

不幸的是,我正在使用静态变量来存储类的数据,因此我可以查找type
int
并检索我存储在那里的任何内容。这更多地是您系统的设计限制。为此,您需要将数据放入一个无类型字段中,并存储某种标识符,然后使用它来获取数据。结束拙见。但是存储仍然是静态的,所以下一个执行它的类实例仍然会覆盖该值,对吗?是的,您是正确的。如果每个实例都需要它自己的变量,那么OP根本没有必要将其声明为静态的。您根本不清楚要实现什么。如果您删除
static
或per在静态变量声明之后立即形成赋值(正如Mahesh所建议的那样),它们都将为您提供预期的输出。@在代码示例中,我在编译时误用static生成匿名成员变量。对
GetArray
的后续调用将返回对匿名成员变量的引用。
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;
}