É possível usar elementos de um tipo diferente do contido em um std :: set para realizar pesquisa e exclusão?

Digamos que eu tenha o seguinte:

struct MetadataThingy {

    void *actual_thingy;
    int some_metadata;
    int more_metadata;

    bool operator<(MetadataThingy const& other) const {
        return actual_thingy < other.actual_thingy;
    }

};

Ondeactual_thingy aponta para alguns dados de importância e eu quero o contêiner ordenado pelo valor deactual_thingy em vez do valor do elemento apontado, mas preciso armazenar alguns outros dados sobre ele, então criei a classe wrapperMetadataThingy com um comparador que considera apenas o valor doactual_thingy ponteiro (em vez de usar um recipiente devoid *)

Agora, dado o seguinte código:

std::set<MetadataThingy> thingy_set;

void test() {

    MetadataThingy m1 { nullptr, 5, 20 };
    MetadataThingy m2 { &m1, 1, 2 };
    MetadataThingy m3 { &m2, 6, 0 };

    thingy_set.insert(m1);
    thingy_set.insert(m2);
    thingy_set.insert(m3);

    MetadataThingy m;
    m = *thingy_set.find(m2); // OK.
    m = *thingy_set.find(static_cast<void *>(&m2)); // Nope. Can't use a pointer.

}

Como cadaMetadataThingy pode ser unicamente identificado pelo valor de ponteiro que ele armazena e é ordenado pelo valor do ponteiro, faria sentido encontrar / excluir objetos simplesmente usando umvoid * como a chave. No momento, porém, eu teria que criar um bonecoMetadataThingy Cada vez que procuro um elemento, sinto-me realmente desleixado. Eu já considerei usar apenas ummap com ponteiros como chave eMetadataThingy como valor, mas desde que cadaMetadataThingy também deve conter o ponteiro de qualquer maneira, isso parece um pouco redundante. Assim,Existe uma maneira de usar um elemento de um tipo diferente daquele armazenado em um conjunto para localizar ou excluir valores no conjunto, uma vez que os elementos dos dois tipos são mutuamente comparáveis? e que elementos de um tipo podem ser mapeados de maneira única no outro (void * eMetadataThingy são isomórficos)? (Eu não incluí nenhum no código acima, mas suponha que haja sobrecargas de operador para compararvoid * eMetadataThingy em qualquer ordem.)

Um pouco sobre o problema que estou tentando resolver, para o caso de alguém poder recomendar uma abordagem melhor: preciso solicitar uma coleção por vários critérios, por isso tenho váriosMetadataThingy contentores, todos ordenados por critérios diferentes. "Metadata" neste caso seria coisa que eu preciso para rastrear as posições dos elementos em todos os recipientes para que eu possa fazer a remoção rápida. Isso soaria como um trabalho perfeito para aumentar os contêineres com vários índices, mas a ordenação desses elementos está mudando constantemente, o que significa que a AFAIK não funcionará.

questionAnswers(4)

yourAnswerToTheQuestion