У меня есть класс, который создает std::function
. Для простоты я скажу, что std::function
возвращает логическое значение для этого примера. std::function
должен принимать кортеж variadi c. В настоящее время у меня есть
template<class... FuncArgs>
class Function
{
public:
// Type that std::function returns
using func_ret_ty = bool;
private:
std::function<func_ret_ty(std::tuple<FuncArgs...>)> m_Function;
std::tuple<FuncArgs...> m_Args; // Stores m_Function's arguments
public:
Function(
std::function<func_ret_ty(std::tuple<FuncArgs...>)> function,
FuncArgs... args)
: m_Function(function)
, m_Args(std::make_tuple(std::forward<FuncArgs>(args)...))
{}
};
Мой вопрос прост: будет ли это работать?
В частности, я обеспокоен тем, что при объявлении типа для * 1009 существует циклическая зависимость *. У меня была еще одна мысль о реализации:
template<class FuncTy, class FuncArgs...>
class Function
{
public:
using func_ret_ty = bool;
private:
FuncTy m_Function;
std::tuple<FuncArgs...> m_Args;
public:
Function(
FuncTy function,
FuncArgs... args)
: m_Args(std::make_tuple(std::forward<FuncArgs>(args)...))
{
static_assert(
std::is_same_v<FuncTy, std::function<func_ret_ty(std::tuple<FuncArgs...>)>>,
"FuncTy invalid type!"
);
m_Function = std::move(function);
}
};
Вторая реализация лучше? Есть ли лучший способ go сделать это?