ইদানীং কিছু কোড পুনরাবৃত্তি সমাধান করার জন্য আমি একটি টেম্পলেট ফাংশন লিখেছিলাম। দেখে মনে হচ্ছে:
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
?