标签: variadic

为什么要使用params关键字?

我知道这是一个基本问题,但我找不到答案.

为什么要用它?如果你编写一个函数或一个使用它的方法,当你删除它时代码仍然可以正常工作,100%没有它.例如:

使用params:

static public int addTwoEach(params int[] args)
{
    int sum = 0;
    foreach (var item in args)
        sum += item + 2;
    return sum;
}
Run Code Online (Sandbox Code Playgroud)

没有参数:

static public int addTwoEach(int[] args)
{
    int sum = 0;
    foreach (var item in args)
       sum += item + 2;
    return sum;
}
Run Code Online (Sandbox Code Playgroud)

c# variadic parameter-passing variadic-functions params

326
推荐指数
7
解决办法
18万
查看次数

如何制作可变参数宏(可变数量的参数)

我想在C中编写一个宏,它接受任意数量的参数,而不是特定的数字

例:

#define macro( X )  something_complicated( whatever( X ) )
Run Code Online (Sandbox Code Playgroud)

哪里X有任何数量的参数

我需要这个,因为它whatever是重载的,可以用2或4个参数调用.

我试过两次定义宏,但第二个定义覆盖了第一个!

我正在使用的编译器是g ++(更具体地说,mingw)

c g++ variadic c-preprocessor

182
推荐指数
5
解决办法
18万
查看次数

在C中转发可变参数函数的调用

在C中,是否可以转发可变参数函数的调用?如,

int my_printf(char *fmt, ...) {
    fprintf(stderr, "Calling printf with fmt %s", fmt);
    return SOMEHOW_INVOKE_LIBC_PRINTF;
}
Run Code Online (Sandbox Code Playgroud)

在这种情况下,以上述方式转发调用显然不是必需的(因为你可以用其他方式记录调用,或者使用vfprintf),但是我正在处理的代码库要求包装器做一些实际的工作,并且没有没有(并且不能添加)类似于vfprintf的辅助函数.

[更新:基于迄今为止提供的答案,似乎存在一些混淆.用另一种方式表达问题:通常,你可以包装一些任意的可变参数函数而不修改该函数的定义.

c variadic

176
推荐指数
6
解决办法
6万
查看次数

在编写自己的函数时如何使用R的省略号功能?

R语言有一个很好的功能,用于定义可以采用可变数量参数的函数.例如,该函数data.frame接受任意数量的参数,并且每个参数都成为结果数据表中列的数据.用法示例:

> data.frame(letters=c("a", "b", "c"), numbers=c(1,2,3), notes=c("do", "re", "mi"))
  letters numbers notes
1       a       1    do
2       b       2    re
3       c       3    mi
Run Code Online (Sandbox Code Playgroud)

函数的签名包括省略号,如下所示:

function (..., row.names = NULL, check.rows = FALSE, check.names = TRUE, 
    stringsAsFactors = default.stringsAsFactors()) 
{
    [FUNCTION DEFINITION HERE]
}
Run Code Online (Sandbox Code Playgroud)

我想编写一个类似的函数,获取多个值并将它们合并为一个返回值(以及进行一些其他处理).为了做到这一点,我需要弄清楚如何...从函数中的函数参数"解包" .我不知道该怎么做.功能定义中的相关行data.frameobject <- as.list(substitute(list(...)))[-1L],我无法理解.

那么如何将省略号从函数的签名转换为例如列表呢?

更具体地说,我如何写get_list_from_ellipsis下面的代码?

my_ellipsis_function(...) {
    input_list <- get_list_from_ellipsis(...)
    output_list <- lapply(X=input_list, FUN=do_something_interesting)
    return(output_list)
}

my_ellipsis_function(a=1:10,b=11:20,c=21:30)
Run Code Online (Sandbox Code Playgroud)

编辑

似乎有两种可能的方法来做到这一点.他们是as.list(substitute(list(...)))[-1L]list(...).但是,这两者并没有完全相同.(有关差异,请参阅答案中的示例.)任何人都可以告诉我它们之间的实际区别是什么,我应该使用哪一个?

parameters r function ellipsis variadic

175
推荐指数
5
解决办法
5万
查看次数

是否有可能在可变参数宏中迭代参数?

我想知道是否有可能迭代传递给C99中的可变参数宏或使用任何GCC扩展的参数?

例如,是否可以编写一个通用的宏,它接受一个结构,并将其字段作为参数传递,并打印结构中每个字段的偏移量?

像这样的东西:

struct a {
    int a;
    int b;
    int c;
};

/* PRN_STRUCT_OFFSETS will print offset of each of the fields 
   within structure passed as the first argument.
*/

int main(int argc, char *argv[])
{
    PRN_STRUCT_OFFSETS(struct a, a, b, c);

    return 0;
}

c foreach c99 variadic c-preprocessor

66
推荐指数
5
解决办法
5万
查看次数

C++ 11可变数量的参数,相同的特定类型

问题很简单,我如何实现一个带有可变数量参数的函数(类似于可变参数模板),但是所有参数都具有相同的类型,比如说int.

我正在考虑类似的东西;

void func(int... Arguments)
Run Code Online (Sandbox Code Playgroud)

或者,类型的递归静态断言不起作用吗?

c++ variadic c++11

45
推荐指数
5
解决办法
2万
查看次数

如何创建一个可变的通用lambda?

从C++ 14开始,我们可以使用泛型lambdas:

auto generic_lambda = [] (auto param) {};
Run Code Online (Sandbox Code Playgroud)

这基本上意味着它的调用操作符基于标记为auto的参数进行模板化.

问题是如何创建一个可以接受可变参数数量的lambda,类似于可变参数函数模板的工作方式?如果这不可能,最接近的东西可以用同样的方法吗?你会怎么存储它?有可能std::function吗?

c++ lambda variadic c++14

37
推荐指数
3
解决办法
2万
查看次数

C 和 C++ 中的 (...) 是什么?

的用途之一...是在 C 和 C++ 中表示可变参数实体。

它叫什么名字?

以这种方式使用时,它是否归类为运算符或其他东西?

关于 的任何其他细节...

编辑: 我知道.... 我问的是它的名称和分类,我希望它在 C 和 C++ 中都相似。

c c++ terminology ellipsis variadic

30
推荐指数
3
解决办法
4174
查看次数

Haskell有可变函数/元组吗?

uncurry函数仅适用于带有两个参数的函数:

uncurry :: (a -> b -> c) -> (a, b) -> c
Run Code Online (Sandbox Code Playgroud)

如果我想用任意数量的参数来解决函数,我可以编写单独的函数:

uncurry2 f (a, b)          = f a b
uncurry3 f (a, b, c)       = f a b c
uncurry4 f (a, b, c, d)    = f a b c d
uncurry5 f (a, b, c, d, e) = f a b c d e
Run Code Online (Sandbox Code Playgroud)

但这很快就会变得乏味.有没有办法概括这个,所以我只需要编写一个函数?

haskell tuples function variadic currying

24
推荐指数
2
解决办法
2856
查看次数

GCC 4.8正在逆转可变参数模板参数包

我刚刚升级到GCC 4.8,一些可变参数模板代码不再正确编译.我在下面创建了一个最小的示例:

#include <tuple>
#include <iostream>

template <class T, class ... OtherT>
void something( std::tuple<T, OtherT...> & tup )
{
  std::cout << std::get<1>(tup) << std::endl;
}

int main()
{
  std::tuple<int, char, bool> myTuple(3, 'a', true);

  // Compiles OK in GCC 4.6.3 but NOT 4.8
  something<int, char, bool>( myTuple );

  // Compiles OK in GCC 4.8 but NOT 4.6.3
  something<int, bool, char>( myTuple );

  return 0;
}
Run Code Online (Sandbox Code Playgroud)

这个输出将是(如果注释掉GCC 4.6.3/4.8的错误版本)'a'.

GCC 4.6.3产生的错误是:

./test.cpp: In function ‘int main()’:
./test.cpp:18:39: error: no matching function …
Run Code Online (Sandbox Code Playgroud)

c++ gcc templates variadic c++11

23
推荐指数
1
解决办法
1760
查看次数