Я хочу создать плагин архитектуры. У меня есть DLL, которая будет служить интерфейсом, и тогда у меня будет несколько DLL для каждой реализации.
class INormalizer {
virtual ~INormalizer() { }
virtual std::string Normalize(const std::string& input) = 0;
virtual void Destroy() = 0;
}
template<typename T> INormalizer* CreateT() { return new T; }
class NormalizerFactory {
public:
typedef std::map<std::string, INormalizer*(*)()> map_type;
static INormalizer* CreateInstance(const std::string& name) {
map_type::iterator it = getMap()->find(name);
if(it == getMap()->end()) {
return NULL;
}
return it->second();
}
protected:
static map_type* getMap() {
if(!_map) {
_map = new map_type;
}
return _map;
}
private:
static map_type* _map;
}
NormalizerFactory::map_type* NormalizerFactory::_map = NULL;
template<typename T>
class DerivedRegister : NormalizerFactory {
public:
DerivedRegister(const std::string& name) {
getMap()->insert(std::make_pair(name, &createT<T>));
}
}
extern "C" __declspec(dllexport) INormalizer* __cdecl CreateNormalizer(const std::string& name) {
return NormalizerFactory::CreateInstance(name);
}
class AlphaNumericOnly : public INormalizer {
public:
~AlphaNumericOnly();
std::string Normalize(const std::string& input) override;
void Destroy() override;
private:
static DerivedRegister<AlphaNumericOnly> _reg;
}
...
DerivedRegister<AlphaNumericOnly> AlphaNUmericOnly::_reg("AlphaNumericOnly");
Q Как я могу заставить каждого исполнителя также включать DerivedRegister<T> _reg
член без добавления к INormalizer
интерфейс.
Q При сборке AlphaNumericOnly.dll компоновщик жалуется LNK2001 за NormalizerFactory::_map
, Я не хочу определять статический член NormalizerFactory::_map
в каждой реализации DLL.
Библиотеки реализации будут использованы LoadLibrary
/GetProcAddress
в клиентском приложении. Если я загружаю AlphaNumericOnly.dll с помощью LoadLibrary
тогда вызов GetProcAddress(hDll, "CreateNormalizer")
не удается, потому что CreateNormalizer
функция не экспортируется в эту DLL.
Задача ещё не решена.
Других решений пока нет …