हाल ही में मैंने कुछ कोड repetitions को हल करने के लिए एक टेम्पलेट फ़ंक्शन लिखा था। यह इस तरह दिख रहा है:
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) {
}
};
ऐसा क्यों है (इसके द्वारा मेरा मतलब है कि यह प्रकार को कम करने में विफल क्यों है) और कैसे (यदि यह बिल्कुल संभव है) क्या मैं इस कोड को संदर्भों के साथ काम कर सकता हूं? जीवंत उदाहरण
Args&&...औरstd::forward?