有什么更好的方法来创建像operator=(value)
-> map[key]=value
这样的(零成本?)代理?
现在,我使用类似的方法,但它不是零成本的,当然也不是最佳选择。
是的,目标地图将在代理生存的所有时间内保证有效。
template <int key>
class proxy {
public:
std::map<int,int> & proxy_m;
proxy(std::map<int,int> & m) : proxy_m(m) {}
void operator=(int value) {
proxy_m[key] = value;
}
};
class A {
public:
std::map<int,int> m;
proxy<1> proxy_one {m};
};
...
A a;
a.proxy_one = 1; // a.m[1] = 1;
谢谢。
最佳答案
我对您提到的非零成本的理解是,您的proxy 存储了对映射的引用,因此强制创建了编译器无法优化的冗余存储。
我认为您的解决方案是在使用时参考地图,以便编译器可以使用“好像”优化来删除它。
例如:
#include <map>
#include <utility>
template <int key>
class proxy {
public:
std::map<int,int> & proxy_m;
proxy(std::map<int,int> & m) : proxy_m(m) {}
void operator=(int value) {
proxy_m[key] = value;
}
};
template<int N>
using key = std::integral_constant<int, N>;
class A {
public:
std::map<int,int> m;
template<int N>
auto get_proxy(key<N>) {
return proxy<1>(m);
}
};
int main()
{
A a;
// in reality no proxy<> will be created and no reference taken
// provided you enable optimisations.
a.get_proxy(key<1>()) = 1;
}
关于c++ - C++-(零成本?)代理,如operator =(value)-> std::map [key] = class内部的值,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/46501273/