2017-07-28 12 views
0

私は自分のプロジェクトにキャッシング機構を工夫しようとしています。基本的には、文字列から値へのマップが必要ですが、実行時に値を開いて決定する必要があります。任意のタイプのキャッシング機構

私が必要とするのは、これを実装する方法に関するアドバイスです。

私のデザインは今、このです:

  • 使用boost::any
  • コンテナ

として使用std::unordered_map<std::string, boost::any>を値を保持するために、私は元の型をお返しするためにメンバーをたいと思い、キャッシュをにできるだけ透明にしたいので、です。何かのような場合しかし、私は本当に知らない

struct internal 
{ 
    boost::any value; 

    template <typename T> 
    T& get() { return boost::any_cast<T&>(value); } // Possible? 
} 

double  &p = cache.get("p"); 
std::string &q = cache.get("q"); 
hugeclass &r = cache.get("r"); 

私はboost::any値、このようなプライベートな構造体を持つ代わりに考えていた:ユーザーはちょうどこのようなものを使用する必要がありますこれは可能ですか、それを実際に得る方法です。

したがって、保持されている値への参照を返す透明なキャッシングクラスを取得するにはどうすればよいですか?

ありがとうございます!あなたはおそらくこれで逃げることができ

+0

それは別に、すべてのタイプをキャッシュするために、おそらく安全です。あなたがこれをすることができない理由はありますか? – patatahooligan

+0

実際はそうではありませんが、これは各タイプのコンテナを用意する必要があることを意味し、これをどのように快適に一般化するかはわかりません。アイデアがあれば、私はもっと幸せになるでしょう! – senseiwa

+1

私はちょうどテンプレートキャッシュを取得しません。ユーザーは、どこに格納されているのかによって、取得している型をすでに知っていなければならないので、複数のキャッシュを宣言する必要がなく、プログラムを実際に変更することはありません。 – patatahooligan

答えて

1

double  &p = cache.get<double>("p"); 
std::string &q = cache.get<std::string>("q"); 
hugeclass &r = cache.get<hugeclass>("r"); 

そうでなければ、私はあなたが可能であるために求めているものとは思いません。


UPDATE:このようget

double p; 
cache.get("p", p); 

:あなたはこのカントーのような設計を試みることができる

template <typename T> 
bool get(const std::string &key, T &output) const { 
    // lookup... 
    // return false if lookup failed 
    output = boost::any_cast<T&>(...); 
    return true; 
} 
+0

今私は正確にこれをやっていますが、どこかに格納して、何とか型を推測することができます()。 – senseiwa

+0

本当に不可能だと確信しています。タイプを別々に保存することはできますが、この変換を自動的に行うことはできません。 –

+0

更新情報@senseiwaを確認してください。 –

関連する問題