有什么更好的方法来创建像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/

10-13 07:05