【问题标题】:How to construct C++ variadic function with regular function parameters alongside如何构造带有常规函数参数的 C++ 可变参数函数
【发布时间】:2021-09-06 18:34:49
【问题描述】:
template<class... Args>
void print(Args... args)
{
    (std::cout << ... << args) << "\n";
}
  
void test(){

    print(1, ':', " Hello", 2 ,  ',', " ", "World!");
}

以上适用于文本

template<class... Args>
void add(int & i, Args... args)
{
    i += args...;
}



void test(){

    int i;
    add(i, 1, 2, 3);
    
}

编辑: 这不会编译为它的假代码,但是否可以使用类似的函数来用数据类型的数据填充向量?

【问题讨论】:

  • 你遇到了什么错误?
  • “看起来你的帖子主要是代码” 不要试图玩弄系统。改为改进您的帖子,例如添加确切的错误消息。
  • 对不起,它的假代码。我想知道是否有类似的代码。
  • i = (args + ...);.
  • 是的,这是可能的。 (i += ... += args);args += (args + ...);,但您需要将 i 初始化为零(或使用 Marek R 建议的内容)。

标签: c++


【解决方案1】:

遍历 args 的两种方法(在这种情况下都是相同的类型), 如果这还不足以让您考虑查看类型列表。 How to use typelists

// With recursion and if constexpr
template<typename arg_t, typename... args_t>
constexpr auto sum_recurse(arg_t n, args_t&&... ns)
{
    if constexpr (sizeof...(args_t) == 0)
    {
        return n;
    }
    else
    {
        return n + sum_recurse(ns...);
    }
}

// or in this case for operations you can use fold expressions
template<typename... args_t>
constexpr auto sum_fold(args_t&&... args)
{
    return (args + ...);
};

int main()
{
    static_assert(sum_recurse(1, 2, 3) == 6);
    static_assert(sum_fold(1, 2, 3) == 6);
    return 0;
}

【讨论】:

    【解决方案2】:

    使用 lambda 迭代输入参数。

    void add(int & i, Args... args)
    {
    
        ([&] (auto & param)
           {
    
            i += param;
    
           } (args), ...);
    
    }
    
    
    
    void main(){
    
        int i=0;
        add(i, 1, 2, 3);
        assert(i == 3);
        
        cout<<"ok";
    }
    

    添加过度,但如果支持较新的 C++ 标准,则可用于许多用途。

    【讨论】:

      猜你喜欢
      • 2016-01-02
      • 1970-01-01
      • 2022-01-17
      • 2011-09-05
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多