gpt4 book ai didi

c++ - 在每个实例化和每个封闭实例中创建方法变量静态的效果

转载 作者:搜寻专家 更新时间:2023-10-31 00:09:35 25 4
gpt4 key购买 nike

众所周知static例程、函数或方法的变量(“成员函数”)exist for each unique instantiation .


(快速审查和完整性检查。)

在通常情况下,这恰好是一个变量:

int f() {
static int i = 0;
return i++;
}

也就是说,有一个变量i那是created in .BSS/.DATA “属于”函数 f .对于模板,它是每个唯一的实例:

template <typename T> int f() {
static int i = 0;
return i++;
}
int g() {
return f<int>() + f<int>() + f<int>() + f<float>();
}

这里有两个独特的实例化(f<int>f<float>),所以有两个i s 在.BSS/.DATA 段中。


问题

我想要某种方法使模板成员函数中的变量在其封闭类的每个实例每个实例化 中都有效。我有兴趣通过或多或少的任何必要的性能手段(可能根本不涉及静态)来实现这种效果。我应该怎么做?

例如:

class Foo { public:
template <typename T> int f() {
static int i = 0;
return i++;
}
};

void g() {
Foo foo1;
Foo foo2;
/*
These will have values a=0, b=0, c=1. This happens because there are two
variables:
"Foo::f<float>()::i"
"Foo::f<double>()::i"
What I *want* is for there to be three variables:
"Foo::f<float>()::i" (foo1's copy)
"Foo::f<float>()::i" (foo2's copy)
"Foo::f<double>()::i" (foo1's copy)
So the result is a=0, b=0, c=0. How can I accomplish this effect (maybe
not using static)?
*/
int a = foo1.f<float>();
int b = foo1.f<double>();
int c = foo2.f<float>();
}

最佳答案

让一个对象的不同实例为您提供不同结果的唯一方法是让这些对象具有具有不同值的成员变量。最简单的方法就是使用 std::type_infostd::map:

struct TypeInfoCompare {
bool operator()(std::type_info const* lhs, std::type_info const* rhs) const {
return lhs->before(*rhs);
}
};

struct Foo {
template <class T>
int f() {
return m[&typeid(T)]++;
}

std::map<std::type_info const*, int, TypeInfoCompare> m;
};

这为您提供了一个针对每个 Foo 实例的不同类型的计数器。


std::map 也可以是一个 std::unordered_map,并使用 std::type_info::hash_code() 作为哈希。

关于c++ - 在每个实例化和每个封闭实例中创建方法变量静态的效果,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42350918/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com