2017-09-30 8 views
0

プロキシのようなプロキシのようなプロキシ=(値) - >標準::マップ[キー] =値

今のところ私はそのようなものを使用していますが、ゼロコストではなく、確かに最良の選択肢ではありません。

はい、ターゲットマップは常にプロキシの存続期間が保証されます。

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; 

ありがとうございます。

+1

あなたは "ゼロコスト" で意味を明確にもらえますか? – juanchopanza

+0

ええと、私は、コンパイルの最適化後にはゼロコストではないことに驚いています。私はそれがメモリ中立ではない(プロキシオブジェクトのメモリを割り当てる必要がある)方法を見ています。さらに、あなたのプロキシクラスがなぜあなたの 'A 'にメソッドを追加するよりも便利であるのか本当に分かりません。 –

+0

事前定義されたキーが1つしかない場合は、マップの代わりに 'int'フィールドを使用してください。 – VTT

答えて

1

あなたが言及した非ゼロコストの私の理解は、あなたのプロキシ<がマップへの参照を格納しているため、コンパイラが最適化できない冗長ストレージの作成を強制します。

私はあなたのための解決策は、使用時に地図を参照することだと考えています。そのため、コンパイラは 'if as' optimisationsを使用してそれを削除できます。例えば

#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; 
} 
+0

はい、そうです。面白いアプローチ、アイデアのおかげで。 – sharro

関連する問題