C++ — использование переменной, не зная, как она называется

У меня есть программа, которая использует плагины. Как я в разработке, эти плагины в настоящее время просто .h and .cpp-файлы, которые я добавляю или удаляю из своего проекта перед повторной компиляцией, но в конечном итоге они будут библиотеками.

Каждый плагин содержит списки данных в векторах, и мне нужно динамически загружать данные из плагинов, не зная, какие плагины присутствуют. Например:

// plugin1.h

extern vector<int> plugin1Data;

// plugin2.h

extern vector<int> plugin2Data;

// main.cpp

vector<vector<int>> pluginDataList;

int CountPlugins () {

    // Some function that counts how many plug-ins are present, got this bit covered ;)
}

int main() {

    int numPlugins = CountPlugins();

    for (int i = 0; i < numPlugins; i++) {

        vector<int> newPluginData = /***WAY TO ADD PLUGIN DATA!!!***/;

        pluginDataList.push_back(newPluginData);
    }
}

У меня уже есть доступ к именам каждого плагина, присутствующего во время моей функции CountPlugins (), и есть список имен, поэтому моим первым чувством было использовать имя из каждого плагина, чтобы создать имя переменной, такое как:

vector<string> pluginNames = /*filled by CountPlugins*/;

string pluginDataName = pluginNames.at(i) + "Data";

// Use pluginDataName to locate plugin1Data or plugin2Data

Это то, что я делал раньше в c#, когда я использовал, чтобы возиться с unity, но я прочитал несколько сообщений stackoverflow, четко заявляя, что это невозможно в C++. Это также довольно грязное решение в C# в любом случае, насколько я помню.

Если бы каждый плагин был классом, а не просто группой векторов, я мог бы получить доступ к определенным данным, делая что-то вроде plugin2.данные… но тогда мне все еще нужно иметь возможность ссылаться на объект, хранящийся в каждом плагине, и это будет означать, что, когда я соберу плагины как библиотеки, мне всегда придется ссылаться на объявление и определение класса, что не идеально (хотя не исключено, что это даст более хорошее решение над всеми).

Я все идеи после этого, любая помощь, которую вы можете предложить будет наиболее приветствуется!

Спасибо! Пит

1 ответ

  1. Почему вы не сохраняете данные как JSON между приложением и плагинами ? Таким образом, вы также позволите другим типам технологий подключаться к вашему приложению, таким как плагины на основе javascript через встроенную версию V8 или плагины c#/.net через mono.’