gpt4 book ai didi

c++ - 在构造函数中使用可变参数初始化std::tuple

转载 作者:行者123 更新时间:2023-12-02 10:21:16 25 4
gpt4 key购买 nike

我有一个创建std::function的类。为了简单起见,我会说std::function返回此示例的 bool(boolean) 值。 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);
}
};

第二种实现更好吗?有没有更好的方法可以做到这一点?

最佳答案

第一种实现对我来说看起来更好,因为您不必通过两次提供函数参数来重复自己。
因为您将返回类型设置为bool,所以我建议将类的名称更改为Predicate,这是一个众所周知的术语,用于描述返回 bool(boolean) 值的函数。

请注意,std::function也可以将参数包作为模板参数,因此您也可以这样做:

std::function<func_ret_ty(FuncArgs...)> m_Function;

关于c++ - 在构造函数中使用可变参数初始化std::tuple,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/60043181/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com