আপনি এখানে যা করতে চান তা সম্পাদন করতে আপনাকে আপনার টেমপ্লেট যুক্তিগুলি একটি টিপলে সংরক্ষণ করতে হবে:
std::tuple<Ts...> args;
তদ্ব্যতীত, আপনাকে আপনার নির্মাতাকে কিছুটা পরিবর্তন করতে হবে। বিশেষত, args
একটি দিয়ে আরম্ভ করা std::make_tuple
এবং আপনার প্যারামিটার তালিকায় সর্বজনীন রেফারেন্সের অনুমতি দেওয়া:
template <typename F, typename... Args>
Action(F&& func, Args&&... args)
: f(std::forward<F>(func)),
args(std::forward<Args>(args)...)
{}
তদুপরি, আপনাকে অনেকটা এর মতো সিকোয়েন্স জেনারেটর স্থাপন করতে হবে:
namespace helper
{
template <int... Is>
struct index {};
template <int N, int... Is>
struct gen_seq : gen_seq<N - 1, N - 1, Is...> {};
template <int... Is>
struct gen_seq<0, Is...> : index<Is...> {};
}
এবং এই জাতীয় জেনারেটর গ্রহণের ক্ষেত্রে আপনি নিজের পদ্ধতিটি প্রয়োগ করতে পারেন:
template <typename... Args, int... Is>
void func(std::tuple<Args...>& tup, helper::index<Is...>)
{
f(std::get<Is>(tup)...);
}
template <typename... Args>
void func(std::tuple<Args...>& tup)
{
func(tup, helper::gen_seq<sizeof...(Args)>{});
}
void act()
{
func(args);
}
এবং এটি! সুতরাং এখন আপনার ক্লাসটি দেখতে এইরকম হওয়া উচিত:
template <typename... Ts>
class Action
{
private:
std::function<void (Ts...)> f;
std::tuple<Ts...> args;
public:
template <typename F, typename... Args>
Action(F&& func, Args&&... args)
: f(std::forward<F>(func)),
args(std::forward<Args>(args)...)
{}
template <typename... Args, int... Is>
void func(std::tuple<Args...>& tup, helper::index<Is...>)
{
f(std::get<Is>(tup)...);
}
template <typename... Args>
void func(std::tuple<Args...>& tup)
{
func(tup, helper::gen_seq<sizeof...(Args)>{});
}
void act()
{
func(args);
}
};
কলিরুতে আপনার সম্পূর্ণ প্রোগ্রাম এখানে।
আপডেট: এখানে একটি সহায়ক পদ্ধতি যা দ্বারা টেমপ্লেট আর্গুমেন্টগুলির বিশদকরণের প্রয়োজন হয় না:
template <typename F, typename... Args>
Action<Args...> make_action(F&& f, Args&&... args)
{
return Action<Args...>(std::forward<F>(f), std::forward<Args>(args)...);
}
int main()
{
auto add = make_action([] (int a, int b) { std::cout << a + b; }, 2, 3);
add.act();
}
এবং আবার, এখানে অন্য ডেমো।