Pergunta

Eu tenho um fluxo de dados que estão contidos em um System::Collections::Queue. Minha fonte de dados pode gerar os mesmos dados para vários fluxos, mas, para isso, precisa duplicar os dados para cada um. Eu atualmente faço o seguinte:

void DataGatherer::AddMyDataToQueues(MyData^ data)
{
    // Send duplicates to all queues
    for( int i = 0; i < m_outputQueues->Count; i++ )
    {
        AddResultToQueue(gcnew MyData(data), (Queue^)m_outputQueues[i]);
    }
}

Que funciona bem enquanto eu estou enviando MyData objetos. Digamos que eu quero enviar MyOtherData objetos também. Seria bom fazer algo mais genérico como este:

void DataGatherer::AddDataToQueues(Object^ obj)
{
    // Send duplicates to all queues
    for( int i = 0; i < m_outputQueues->Count; i++ )
    {
        AddResultToQueue(gcnew Object(obj), (Queue^)m_outputQueues[i]);
    }
}

... mas isso não vai compilar porque:

1>.\DataGatherer.cpp(72) : error C3673: 'System::Object' : class does not have a copy-constructor

Então, é possível duplicar um objeto sem conhecer seu tipo? ..e se sim, como faço isso? :)

Foi útil?

Solução

Ter ambos MyData e MyOtherData implemento ICloneable, então mude AddDataToQueues aceitar qualquer objeto que implemente o iCloneable.

public ref class MyOtherData : public ICloneable
{
public:
    MyOtherData()
        : m_dummy(-1)
    {
    }

    virtual Object^ Clone()
    {
        MyOtherData ^clone = gcnew MyOtherData();
        clone->m_dummy = m_dummy;
        return clone;
    }

private:
    int m_dummy;
};

e depois ...

void DataGatherer::AddDataToQueues(ICloneable^ data)
{
    // Send duplicates to all queues
    for( int i = 0; i < m_outputQueues->Count; i++ )
    {
        AddResultToQueue(data->Clone(), (Queue^)m_outputQueues[i]);
    }
}
Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top