在构造函数中使用可变参数初始化 std::tuple
Initialize std::tuple with variadic arguments in constructor
我有一个 class 创建一个 std::function
。为简单起见,在本示例中,我将 std::function
returns 设为布尔值。 std::function
需要接受可变元组。目前,我有
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)...))
{}
};
我的问题很简单:这行得通吗?
更具体地说,我很担心,因为在为 function
声明类型时似乎存在循环依赖。我的另一个实施想法是:
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);
}
};
第二种实现更好吗?有没有更好的方法来做到这一点?
我觉得第一个实现更好,因为您不必通过提供两次函数参数来重复自己。
因为您将 return 类型设置为 bool
,我建议将 class 的名称更改为 Predicate
,这是描述 [=19] 函数的众所周知的术语=] 布尔值。
注意std::function
也可以将参数包作为模板参数,所以你也可以这样做:
std::function<func_ret_ty(FuncArgs...)> m_Function;
我有一个 class 创建一个 std::function
。为简单起见,在本示例中,我将 std::function
returns 设为布尔值。 std::function
需要接受可变元组。目前,我有
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)...))
{}
};
我的问题很简单:这行得通吗?
更具体地说,我很担心,因为在为 function
声明类型时似乎存在循环依赖。我的另一个实施想法是:
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);
}
};
第二种实现更好吗?有没有更好的方法来做到这一点?
我觉得第一个实现更好,因为您不必通过提供两次函数参数来重复自己。
因为您将 return 类型设置为 bool
,我建议将 class 的名称更改为 Predicate
,这是描述 [=19] 函数的众所周知的术语=] 布尔值。
注意std::function
也可以将参数包作为模板参数,所以你也可以这样做:
std::function<func_ret_ty(FuncArgs...)> m_Function;