Лучшее, что вы можете сделать, не прибегая к макросам (которые также не помогли бы здесь, чтобы полностью решить вашу проблему, нам понадобится какое-то статическое отражение), это исправить эти повторения:
if (auto sp = mC1.lock())
{
sp->method1_C1();
}
else
{
throw std::Exception("object C1 is not loaded in the lib.");
}
ЧтоЯ вижу, что вы можете легко превратить его в шаблонную функцию, например:
template<class T, class R, class... Args>
R call_or_throw(const std::weak_ptr<T>& ptr, const std::string& error, R (T::*fun)(Args...), Args... args) {
if (auto sp = ptr.lock())
{
return std::invoke(fun, *sp, args...);
}
else
{
throw std::runtime_error(error.c_str());
}
}
Чем вы можете использовать его так:
int method1_C1(int x)
{
return call_or_throw(mC1, "object C1 is not loaded in the lib.", &C1::method1_C1, x);
}
void method2_C1(double y)
{
return call_or_throw(mC1, "object C1 is not loaded in the lib.", &C1::method2_C1, y);
}
Вы можете даже сделать из него макрос