I have a program in C++ with plugins (dynamic libs). In the main program, I want to execute a static function to check if i can create a object of this type.
An example without dynamic libs (aren't neccesary to understand the problem):
#include "libs/parent.h"
#include "libs/one.h"
#include "libs/two.h"
int main(int argc, char * argv[])
{
Parent* obj;
if (One::match(argv[1]))
obj = new One();
else if (Two::match(argv[1]))
obj = new Two();
}
Now, i have a interface class named Parent. All plugins inherit from this class. Ideally, I have a virtual static function in Parent named match, and all the plugins need to reimplement this function.
The problem with this code is that i can't do a static virtual function in C++, so i don't know how to s开发者_运维知识库olve the problem.
Sorry for mi english, i did my best
What you have here is classic factory pattern. You want to create an interface named IPluginFactory
which would have two methods - match
and create
(or, optionally, combine them both in a single method). Then each of your plugin DLLs would have a class that implements this interface.
Parent obj;
IPluginFactory *one = new OneFactory();
IPluginFactory *two = new TwoFactory();
if (one->match(argv[1]))
obj = one->createObj();
else if (two->match(argv[1]))
obj = two->createObj();
You could add some static string
to each of your plugins, that would hold it's name. Or make some struct called PluginID
and add this string
to this struct (and probably something else plugin-specific).
Now matching in runtime seems to become very simple. Just check whether that static identification string from your plugin matches your argv.
This is a commonly used implementation of a so-called "your-own-and-simple-rtti", guess it would solve your problems.
精彩评论