In letzter Zeit habe ich eine Vorlagenfunktion geschrieben, um einige Code-Wiederholungen zu lösen. Es sieht aus wie das:
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 main() {
auto a = std::make_shared<A>();
call_or_throw(std::weak_ptr<A>(a), "err", &A::foo, 1);
}
Dieser Code funktioniert perfekt und class Asieht folgendermaßen aus:
class A {
public:
void foo(int x) {
}
};
Aber kompiliert nicht für einen wie diesen:
class A {
public:
void foo(const int& x) {
}
};
Warum ist es so (warum meine ich, warum der Typ nicht abgeleitet werden kann) und wie (wenn es überhaupt möglich ist) kann ich diesen Code mit Referenzen arbeiten lassen? Live Beispiel
Args&&...undstd::forward?