说我有以下方法:
def methodA(arg, **kwargs):
pass
def methodB(arg, *args, **kwargs):
pass
Run Code Online (Sandbox Code Playgroud)
在methodA中,我希望调用methodB,传递kwargs.但是,似乎如果我定义methodA如下,第二个参数将作为位置而不是命名变量参数传递.
def methodA(arg, **kwargs):
methodB("argvalue", kwargs)
Run Code Online (Sandbox Code Playgroud)
如何确保methodA中的**kwargs作为**kwargs传递给methodB?
我正在尝试使用带有泛型类型的C stdarg.h lib.int类型,是我的泛型类型>要理解它,请继续阅读.所以,我的问题是:
我有一个函数接受可变数量的参数.喜欢
void function (int paramN, ...);Run Code Online (Sandbox Code Playgroud)
在我的程序中,没有办法知道,哪个是变量参数的类型,它可以是char,数组,int,short,函数点等...就像
function (paramN, "Hey, I'm a string", 1, function_pint, array, -1); // -1 is a sentinel.Run Code Online (Sandbox Code Playgroud)
所以,我认为,一个int,是32位,在x86(32位)系统中,这将保存所有内存地址.所以,如果我用int得到所有参数,那就不会有问题了,例如,"嘿,我是一个字符串"这个字符串的地址,通常适合32位变量,所以,我只需要制作演员.
我是正确的?
我可以做吗?
注意:我不想让我的函数像printf(这个解决方案,在这种情况下不适合好吗?)
谢谢你的回答.
抱歉我的英语不好.
我希望能够在父类中声明一个具有未知数量参数的抽象函数:
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) 好的,我正在调用一个带签名的方法,(Class<? extends Throwable>... exceptions)我在main方法中得到一个"File.java使用未经检查或不安全的操作"警告:
public class VarargsFun {
public void onException(Class<? extends Throwable>... exceptions) { }
public static void main(String[] args) {
new VarargsFun().onException(IllegalArgumentException.class);
}
}
Run Code Online (Sandbox Code Playgroud)
编译器是否应该能够看到IllegalArgumentException确实扩展了RuntimeException,Exception并且Throwable?
我应该如何正确修改我的代码以摆脱这个警告?
我真的不想实例化我的例外......使用它似乎更好 .class
(不要用@SuppressWarnings任何一个!)
我正在使用java 7.感谢任何提示.
java generics exception variadic-functions compiler-warnings
我想要一个辅助函数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() …
我有一个类有两个这样的方法:
public class Dummy{
public void doIt(String arg1, File arg2, Writer... ctx){
// Do something very important...
}
public void doIt(String arg1, Writer... ctx){
// Do something else...
}
public static void main(String[] args){
new Dummy().doIt("Test", null);
}
}
Run Code Online (Sandbox Code Playgroud)
我希望,编译器会给出错误,因为方法调用是不明确的.而是调用第二种方法.
在我们的例子中,ambigous方法是从数据库方法和稍后添加的varargs生成的.现在我们不知道如何避免方法调用的问题,如示例中所示.
有没有其他人有这个问题,并有一个想法如何解决它?
我有这个代码:
#include <iostream>
using namespace std;
int print(int i)
{
cout << endl << i;
}
template<typename ...Args>
inline void pass(Args&&...args)
{
}
template<typename ...args>
inline void expand(args&&... a)
{
print(a) ...; //this doesn't expand
//pass( print(a)... ); this works
}
int main() {
expand(1,2,3,4);
return 0;
}
Run Code Online (Sandbox Code Playgroud)
它抛出一个错误:
In function 'void expand(args&& ...)':
error: expected ';' before '...' token
print(a) ...;
^
parameter packs not expanded with '...':
print(a) ...;
^
Run Code Online (Sandbox Code Playgroud)
为什么要使用这个pass()功能?
假设我有类型A,B有构造函数A(int a, double b, std::string c),B(double a, int b).
我知道如何定义一个实例化A或B通过可变参数模板的函数.
有没有办法设计一个函数/宏/类型,对于一个类型T和一系列T构造函数参数的可能性向量,它为我提供了所有可能的对象?
例如,如果我使用这个神奇的构造,<A, {2, 5, 6}, {2.44, 3.14}, {"yes", "no"}>它应该提供对象:
A(2, 2.44, "yes")
A(2, 2.44, "no")
A(2, 3.14, "yes")
...
A(6, 3.14, "no")
Run Code Online (Sandbox Code Playgroud)
这同样适用于B任何其他类型,而不必重新设计魔法结构.
例如,这在Python中非常简单,但我不知道它是否可以在C++中使用.
在这段代码中,
package com.example;
interface CollectorIF<T> {
// @SafeVarargs // Error: @SafeVarargs annotation cannot be applied to non-final instance method addAll
void addAll(T... values);
}
class Collector<T> implements CollectorIF<T> {
@SafeVarargs
public final void addAll(T... values) {
}
}
class Component<T> {
public void compute(T value) {
Collector<T> col1 = new Collector<>();
col1.addAll(value); // No warning
CollectorIF<T> col2 = new Collector<>();
col2.addAll(value); // Type safety: A generic array of T is created for a varargs parameter
}
}
Run Code Online (Sandbox Code Playgroud)
在Type safety: …
我有一个在PHP 7中定义的varargs类型方法
function selectAll(string $sql, ...$params) { }
Run Code Online (Sandbox Code Playgroud)
我遇到的问题是,当我已经有一个数组时,有时我想调用这个方法,我不能直接将数组变量传递给这个方法.