簡體   English   中英

如何在C ++中定義自引用映射?

[英]How to define a self-referential map in C++ ?

我可以這樣定義一個結構:

struct A{
    map<string,A> m;
};

我可以這樣使用它:

A a;
a.m["abc"].m["def"];

但我想這樣使用它:

a["abc"]["def"];

這需要a map<string,typeof(a)>

但我無法定義諸如map<string,map<string,...>>

這不需要無限的空間,但是我不知道如何在C ++中定義這樣的東西。 我怎樣才能做到這一點?

你不能。 對於C ++中的自引用數據結構,您需要使用指針。

即使是這樣

struct A {
    map<string, A> m;
};

是不正確的,因為您正在使用類型A作為尚未完全定義的std::map的參數(此時它具有“不完整的類型”)。

它在大多數編譯器中都能“運行”,但不是正式有效的C ++代碼。

但是請注意,如果您所需要的只是鏈式operator[] ,那么在您的實現已經接受map<string, A>成員的情況下map<string, A>這很容易做到:

struct A {
    map<string, A> m;
    A& operator[](const string& key) {
        return m[key];
    }
}

在g ++和clang ++上編譯的示例(但請記住,它不是有效的C ++):

#include <map>
#include <string>
#include <stdio.h>

struct A {
    std::map<std::string, A> m;
    A& operator[](const std::string& x) { return m[x]; }
};

void dump(const A& a, int indent=0) {
    for (auto& i : a.m) {
        printf("%*s%s\n", indent, "", i.first.c_str());
        dump(i.second, indent+2);
    }
}

int main(int argc, const char *argv[]) {
    A a;
    a["1"]["1.1"];
    a["1"]["1.2"];
    a["1"]["1.3"];
    a["2"]["2.1"];
    a["2"]["2.2"];
    a["3"]["3.1"]["3.1.1"]["3.1.1.1"];
    a["4"];

    dump(a);

    return 0;
}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM