【问题标题】:Initialize std::tuple with variadic arguments in constructor在构造函数中使用可变参数初始化 std::tuple
【发布时间】:2020-02-03 16:19:47
【问题描述】:

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

第二个实现更好吗?有没有更好的方法来做到这一点?

【问题讨论】:

  • 你的static_assert 限制太多,std::is_assignable 似乎更合适。
  • 我没有看到你循环依赖
  • @Jarod42 我认为存在循环依赖的原因是因为我在 std::function 参数类型中使用了这些类型之后声明了 FuncArgs... 的类型。

标签: c++ templates types variadic-templates sfinae


【解决方案1】:

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

注意std::function也可以将参数包作为模板参数,所以你也可以这样做:

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

【讨论】:

  • 谢谢。我没有直接使用参数包的原因是因为我在这个类中有一个名为run() 的方法,它将m_Args 传递给m_Function,这意味着我需要存储参数包的任何值。除了元组,我不知道该怎么做。还有其他方法吗?
  • stackoverflow.com/questions/7858817/… 这能回答你的问题吗?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-11-17
  • 1970-01-01
  • 1970-01-01
  • 2015-09-04
  • 2021-03-26
  • 1970-01-01
相关资源
最近更新 更多