Gần đây tôi đã viết một hàm mẫu để giải quyết một số lần lặp lại mã. Nó trông như thế này:
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);
}
Mã này hoạt động hoàn toàn tốt class A
mà trông như thế này:
class A {
public:
void foo(int x) {
}
};
Nhưng không thể biên dịch cho một cái như thế này:
class A {
public:
void foo(const int& x) {
}
};
Tại sao nó lại như vậy (tại sao tôi có nghĩa là tại sao nó không thể suy ra loại) và làm thế nào (nếu có thể) tôi có thể làm cho mã này hoạt động với các tham chiếu? Ví dụ sống
Args&&...
vàstd::forward
?