最近,我编写了一个模板函数来解决一些代码重复。看起来像这样:
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);
}
这段代码非常适合class A
如下所示:
class A {
public:
void foo(int x) {
}
};
但无法像这样编译:
class A {
public:
void foo(const int& x) {
}
};
为什么会这样(为什么我要说为什么它无法推断类型)以及如何(如果可能的话)使此代码与引用一起使用? 现场例子
@ user3365922尝试过。感觉像解决方案,不起作用
—
bartop,
Args&&...
和std::forward
?