标签: variadic-functions

如何通过PHP中的引用传递可变函数的参数?

假设有可能,如何在不在PHP中生成警告的情况下通过引用可变参数函数来传递参数?我们不能再在函数调用中使用'&'运算符,否则我会接受(即使它很容易出错,如果编码器忘了它).

启发这一点的是我发掘的旧MySQLi包装类(现在,我只使用PDO).包装器和MySQLi类之间的唯一区别是包装器抛出异常而不是返回FALSE.

class DBException extends RuntimeException {}
...
class MySQLi_throwing extends mysqli {
    ...
    function prepare($query) {
        $stmt = parent::prepare($query);
        if (!$stmt) {
            throw new DBException($this->error, $this->errno);
        }
        return new MySQLi_stmt_throwing($this, $query, $stmt);
    }
}
// I don't remember why I switched from extension to composition, but
// it shouldn't matter for this question.
class MySQLi_stmt_throwing /* extends MySQLi_stmt */ {
    protected $_link, $_query, $_delegate;

    public function __construct($link, $query, $prepared) {
        //parent::__construct($link, $query);
        $this->_link = $link;
        $this->_query = …
Run Code Online (Sandbox Code Playgroud)

php pass-by-reference variadic-functions

13
推荐指数
2
解决办法
2080
查看次数

Java:重载方法解析和varargs - 令人困惑的例子

正当我认为我理解JLS15.12应用于varargs时,这是这个例子:

package com.example.test.reflect;

public class MethodResolutionTest2 {
    public int compute(Object obj1, Object obj2) {
        return 42;
    }   
    public int compute(String s, Object... objects)
    {
        return 43;
    }

    public static void main(String[] args) {
        MethodResolutionTest2 mrt2 = new MethodResolutionTest2();
        System.out.println(mrt2.compute("hi",  mrt2));  
        System.out.println(mrt2.compute("hi",  new Object[]{mrt2}));    
        System.out.println(mrt2.compute("hi",  new Object[]{mrt2, mrt2, mrt2}));
    }
}
Run Code Online (Sandbox Code Playgroud)

打印出来的

42
43
43
Run Code Online (Sandbox Code Playgroud)

我理解第一行:JLS15.12表示方法解决是分阶段进行的,而第1阶段和第2阶段忽略了varargs方法,以确定是否存在兼容方法,仅当阶段1和阶段2失败时才会发生阶段3(包括变量).(参见JLS和这个问题.)compute(String s, Object... objects)如果compute(Object obj1, Object obj2)适用,总是被忽略.

但我不明白为什么43为其他两行打印.An Object[]也是一个实例Object,为什么它与varargs方法匹配?


编辑:

...还有这个

Object arg2 …
Run Code Online (Sandbox Code Playgroud)

java variadic-functions jls

13
推荐指数
1
解决办法
2168
查看次数

Scala - 可以取消应用返回varargs?

L1下面的对象有效.我可以L1通过传入varargs 来"创建" ,这很好,但我希望能够L1使用相同的语法分配给一个.不幸的是,我在这里完成它的方式需要更粗略的嵌套Array内部语法L1.

object L1 {
    def apply(stuff: String*) = stuff.mkString(",")
    def unapply(s: String) = Some(s.split(","))
}
val x1 = L1("1", "2", "3")
val L1(Array(a, b, c)) = x1
println("a=%s, b=%s, c=%s".format(a,b,c))
Run Code Online (Sandbox Code Playgroud)

我尝试以一种显而易见的方式实现这一目标,L2如下所示:

object L2 {
    def apply(stuff: String*) = stuff.mkString(",")
    def unapply(s: String) = Some(s.split(","):_*)
}
val x2 = L2("4", "5", "6")
val L2(d,e,f) = x2
println("d=%s, e=%s, f=%s".format(d,e,f))
Run Code Online (Sandbox Code Playgroud)

但是这给出了错误:

error: no `: _*' annotation allowed here 
(such …
Run Code Online (Sandbox Code Playgroud)

scala variadic-functions unapply

13
推荐指数
1
解决办法
962
查看次数

将NSArray内容转换为varargs(使用ARC)以与NSString initWithFormat一起使用

我们今天有一些代码接受NSArray并将其作为参数列表传递给 - [NSString initWithFormat:arguments],我们试图让它与ARC一起工作.这是代码使用的

NSString* format = @"Item %s and Item %s"; // Retrieved elsewhere
NSArray* args = [NSArray arrayWithObjects:@"1", @"2", nil]; // Retrieved elsewhere

// http://cocoawithlove.com/2009/05/variable-argument-lists-in-cocoa.html
char* argsList = (char*) malloc(sizeof(NSString*) * args.count);
[args getObjects:(id*) argsList];
NSString* message = [[[NSString alloc] initWithFormat:format arguments:argsList] autorelease];
free(argsList);
Run Code Online (Sandbox Code Playgroud)

有关如何使ARC符合要求的任何建议?或者我们甚至愿意接受更好的方式.

objective-c variadic-functions automatic-ref-counting

13
推荐指数
1
解决办法
4689
查看次数

重复使用可变参数函数参数不起作用

我有一个函数,试图将东西记录到控制台和日志文件,但它不起作用.第二次使用变长参数会将垃圾写入控制台.有任何想法吗?

    void logPrintf(const char *fmt, ...) {
        va_list ap;    // log to logfile
        va_start(ap, fmt);
        logOpen;
        vfprintf(flog, fmt, ap);
        logClose;
        va_end(ap);
        va_list ap2;   // log to console
        va_start(ap2, fmt);
        printf(fmt, ap2);
        va_end(ap2);
    }
Run Code Online (Sandbox Code Playgroud)

c c++ variadic variadic-functions

13
推荐指数
2
解决办法
4128
查看次数

用varargs实现泛型方法

在我的代码中,当类型是数组时,在实现泛型方法时使用varargs似乎很方便:

public interface Codec<D,E> {
  E encode(D decoded);
  D decode(E encoded);
}

public class MyCodec implements Codec<byte[], char[]> {
  @Override char[] encode(byte... decoded) {...}
  @Override byte[] decode(char... encoded) {...}
}
Run Code Online (Sandbox Code Playgroud)

当我写这篇文章时,Eclipse会显示一条警告:

与MyCodec.encode(byte ...)和Codec.encode(byte [])不同,Varargs方法只应覆盖或覆盖其他varargs方法

我应该忽略这个警告,还是会导致一些无法预料的问题?

java eclipse generics variadic-functions

13
推荐指数
1
解决办法
3524
查看次数

在可变参数模板函数中连接字符串(和数字)

我正在尝试编写一个函数,它接受各种字符串或数字(与std::to_string它们一起使用并连接它们.我只使用它来处理字符串,但是我在根据输入作为字符串或数字进行特殊处理时遇到了麻烦.

我的代码被调用如下:

stringer("hello", "world", 2, 15, 0.2014, "goodbye", "world")

这就是我所拥有的:

inline std::string stringer(const std::string &string)
{
    return string;
}

template <typename T, typename... Args>
inline std::string stringer(const std::string &string, T &&val, Args &&...args)
{  
    return stringer(string+std::to_string(val), std::forward<Args>(args)...);
}

template <typename... Args>
inline std::string stringer(const std::string &string, Args &&...args)
{
    return stringer(string, std::forward<Args>(args)...);
}
Run Code Online (Sandbox Code Playgroud)

目前它正在打破任何多个字符串添加,除非以下是所有数字(由于to_string).如何根据字符串或数字进行专门化以完成上述工作?谢谢.

c++ variadic-functions variadic-templates c++11

13
推荐指数
4
解决办法
7497
查看次数

完全忽略C函数的可变参数是否安全?

我有一个大致如此的功能:

typedef struct SomeType {
  ...
} SomeType;

void TakesArgs(SomeType *t1, ...) {
     // iterates through arguments
}

// usage:
TakesArgs(&a, &b, &c);
Run Code Online (Sandbox Code Playgroud)

如果我要更改TakesArgs为无操作,同时仍保持所有调用代码不变,我是否会使用内存(或其他方式)运行任何奇怪的风险?

void TakesArgs(SomeType *t1, ...) {
    return;
}

// usage unchanged: 
TakesArgs(&a, &b, &c);
Run Code Online (Sandbox Code Playgroud)

换句话说,跳过在原始实现中执行的va_list/ va_startdance会有任何奇怪的副作用吗?

c variadic-functions

13
推荐指数
1
解决办法
512
查看次数

PHP:我可以使用可变数量的参数声明一个抽象函数吗?

我希望能够在父类中声明一个具有未知数量参数的抽象函数:

abstract function doStuff(...);
Run Code Online (Sandbox Code Playgroud)

然后使用一组提示参数定义一个实现:

 /**
 * @param int $userID
 * @param int $serviceproviderID
 */
static function doStuff($userID, $serviceproviderID) {}
Run Code Online (Sandbox Code Playgroud)

到目前为止,我得到的最佳方法是,

abstract function doStuff();

 /**
 * @param int $userID
 * @param int $serviceproviderID
 */
static function doStuff() {
    $args = func_get_args();
    ...
}
Run Code Online (Sandbox Code Playgroud)

但每次调用函数时,由于提示,我都会收到一堆"缺少参数"的警告.有没有更好的办法?

编辑:问题是错的,请不要浪费你的时间回答.以下是我正在寻找的东西,似乎没有任何警告.

abstract class Parent {
    abstract function doStuff();
}

/**
* @param type $arg1
* @param type $arg2
*/
class Child extends Parent {
    function doStuff($arg1, $arg2) {
        ...
    }
}
Run Code Online (Sandbox Code Playgroud)

php function variadic-functions abstract

12
推荐指数
2
解决办法
1万
查看次数

将varargs传递给printf

我想要一个辅助函数log,基本上执行以下操作:

log(file, "array has %d elements\n", 10);
// writes "2014-02-03 16:33:00 - array has 10 elements" to &file
Run Code Online (Sandbox Code Playgroud)

我有时间部分,我有文件写入部分.然而,问题是方法签名本身log- 我应该放什么?表示printf声明以...关键字结束,但我如何在我的函数中使用它?

void log(FILE *f, const char * format, ...) // how would I pass ... to fprintf?
Run Code Online (Sandbox Code Playgroud)

让我编辑这个包含更多信息.

我有一个const char * now ()返回"2014-02-03 16:33:00"形式的字符串.我想像这样传递另一个格式字符串.这两个陈述应该是等同的:

log(file, "array has %d elements\n", 10);
fprintf(file, "%s - array has %d elements\n", now(), 10);
Run Code Online (Sandbox Code Playgroud)

我知道这vfprintf可以让我通过va_list,但我怎么能把它now() …

c printf function variadic-functions

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