5

これは無理そうですが、とにかく聞いてみようと思いました。

私は次のように定義しましたboost::variant

typedef boost::variant<double, int, std::string> ConfigVariant;

コードの後半で、次のstd::mapように定義します。

std::map<std::string, ConfigVariant> my_map;

std::map<std::string, ConfigVariant>今、私は内部に値を持ちたいと思っていますmy_map。たとえば、私はこれをしたいと思います:

my_map[key1][key2] = "hello world";

これが不可能だと思う理由は、対応するバリアント定義が次のようになるように思われるためです。

typedef boost::variant<double, int, std::string, std::map<std::string, ConfigVariant> ConfigVariant;

そのような型定義を行うことは不可能なので、これを回避する方法はありますか?

4

4 に答える 4

0

boost::anyを使用すると、それが機能します。 私もちょうど 30 分前にこのコードを書きましたboost::variant。これは基本的に単なる美化されたvoid*ポインターですが、型チェック アサートが含まれています。ボンネットの下にある単なるボイド*でもあると思いboost::anyますが、よくわかりません。 私のコードが (意図的に) データの所有権を取得していないことを忘れていました。それを使用したい場合は変更する必要があります。それは難しいかもしれません。boost::any は所有権を取得するため、より良いオプションになる可能性があります。

コードは次のようになります。

typedef std::map<std::string, boost::any> ConfigMap;

または、スマート ポインターを使用します。

struct Data;

typedef std::map<std::string, std::unique_ptr<Data> > ConfigMap;

struct Data
{
    boost::variant<blah> value;
    ConfigMap map;
};

フォルダ構造のようなものと考えてください。フォルダーにはファイルが含まれており、フォルダーを含めることもできます。

Ideone.comでコンパイルしたものを次に示します。ただし、ユーザーフレンドリーなクラスにラップする方が良いでしょう。

于 2013-07-29T03:55:01.930 に答える