我有一个可变参数模板函数:
template<typename T, typename ArgType>
vector<T>
createVector(const int count, ...)
{
vector<T> values;
va_list vl;
va_start(vl, count);
for (int i=0; i < count; ++i)
{
T value = static_cast<T>(va_arg(vl, ArgType));
values.push_back(value);
}
va_end(vl);
return values;
}
Run Code Online (Sandbox Code Playgroud)
这适用于T和ArgType的一些(对我来说,奇怪的)配置,但不是我期望的方式:
// v1 = [0.0, 1.875, 0.0]
vector<float> v1 = createVector<float, float>(3, 1.0f, 2.0f, 3.0f);
// v2 = [0.0, 1.875, 0.0]
vector<float> v2 = createVector<float, float>(3, 1.0, 2.0, 3.0);
// v3 = [1.0, 2.0, 3.0]
vector<float> v3 = createVector<float, double>(3, 1.0, 2.0, 3.0);
// …Run Code Online (Sandbox Code Playgroud) 我来自C(++)背景,我对Java的主要兴趣是Android开发.对我来说,这似乎是一个显而易见的问题,但我还没有发现它在任何地方都得到了解决(我确实搜索了stackoverflow并谷歌).我找到的是很多评论,例如:
public String foo(String key, Object[] parameters) {..}Run Code Online (Sandbox Code Playgroud)and
public String foo(String key, Object... parameters) {..}Run Code Online (Sandbox Code Playgroud)are equal
实际上,"Varargs"的java文档明确指出"最后一个参数类型之后的三个句点表明最终参数可以作为数组或参数序列传递"
从同一来源,最常说的理由是,varargs具有"核心API中的重要用途,包括反射,消息格式化和新的printf工具".
鉴于Java是面向对象的,包括垃圾收集并支持动态数组和 Java varargs仅限于单一类型,这有什么优势?(与之相反,例如,C实现了附加功能.)
这可以完成吗?有没有,例如,某种va_num_args?
基本上,我以prinf()类似的方式在串行端口上记录事件,采用格式字符串,并且可选地,使用一些参数.我想知道是否存在任何此类选项参数.
我可以区分Trace("No paramters here");和Trace("forty two = %d", 43 - 1);吗?
我无法将变量参数正确传递给方法 - 该方法旨在选择加权分布中的随机值并返回所选结果的索引.
一个示例用法是:
int pickupType = randomManager->ByWeights( 3, 0.60f, 0.20f, 0.20f );
switch( pickupType ) {
// ... pickupType should be 0 to 2, which we can then branch on
}
Run Code Online (Sandbox Code Playgroud)
该功能定义如下:
#include <cstdarg>
int RandomManager::ByWeights( int weightCount, ... ) {
va_list argList;
// Get the total of all weights
va_start( argList, weightCount );
float weightTotal = 0;
for ( int i = 0; i < weightCount; i++ ) {
weightTotal += va_arg( argList, float );
}
va_end( argList …Run Code Online (Sandbox Code Playgroud) 更新:我在这里修改了代码,以便您可以直接插入并尝试编译.
Clang 3.4.1(LLVM 3.4)抱怨我的类在可变参数函数中使用时不是POD类型(据我能说的最多).G ++编译没有问题.
即使按照C++ 03的标准,这个类也是POD:
而C++ 11对"POD"的规则是放松的,那么这里发生了什么?
关于代码:这是矢量的模板类(如矢量图形中所示),可变参数函数仅用于使用一些任意数据填充数组.
我的类头文件:
template<typename TYPE>
class Vec3t;
typedef Vec3t<float> Vec3f;
template<typename TYPE>
class Vec3t {
public:
Vec3t<TYPE>( void ){}
Vec3t<TYPE>( const TYPE nx, const TYPE ny, const TYPE nz ){}
Vec3t<TYPE> operator-(void) const{}
Vec3t<TYPE> operator*( const Vec3t<TYPE> &other ) const{}
Vec3t<TYPE> operator*( const TYPE val ) const{}
Vec3t<TYPE>& operator*=( const Vec3t<TYPE> &other ){}
Vec3t<TYPE>& operator*=( const TYPE val ){}
Vec3t<TYPE> operator+( const Vec3t<TYPE> &other ) const{}
Vec3t<TYPE> operator+( …Run Code Online (Sandbox Code Playgroud) 如果想在C中编写一个函数,将一个变量参数列表传递给printf一个必须使用该vprintf版本的函数.如何为自定义函数实现此机制?
换句话说,如何是什么套的精髓vprintf除了printf在符合标准的C语言实现?
我试图实现一个方法来合并任意数量的数组.
@SuppressWarnings("unchecked")
public static <T> T[] merge(T[]... arrs) {
int length = 0;
for (T[] arr : arrs) {
length += arr.length;
}
T[] merged = (T[]) new Object[length];
int destPos = 0;
for (T[] arr : arrs) {
System.arraycopy(arr, 0, merged, destPos, arr.length);
destPos += arr.length;
}
return merged;
}
Run Code Online (Sandbox Code Playgroud)
它编译,看起来没有问题.然后我测试了这个方法:
String[] a = {"a", "b", "c"};
String[] b = {"e", "f"};
String[] c = {"g", "h", "i"};
String[] m = merge(a,b,c);
Run Code Online (Sandbox Code Playgroud)
虽然此代码已成功编译,但它会引发异常:
Exception in thread "main" java.lang.ClassCastException: [Ljava.lang.Object; …Run Code Online (Sandbox Code Playgroud) 有没有办法将接口作为varargs参数传递给groovy中的方法?
这是我正在尝试做的事情:
interface Handler {
void handle(String)
}
def foo(Handler... handlers) {
handlers.each { it.handle('Hello!') }
}
foo({ print(it) }, { print(it.toUpperCase()) })
Run Code Online (Sandbox Code Playgroud)
当我运行以下代码时,我收到错误:
No signature of method: ConsoleScript8.foo() is applicable for argument types: (ConsoleScript8$_run_closure1, ConsoleScript8$_run_closure2) values: [ConsoleScript8$_run_closure1@4359df7, ConsoleScript8$_run_closure2@4288c46b]
我需要改变什么?
在准备Java认证考试时,我很惊讶地发现Java允许这样:
public class Consumer {
public void buy(Object o) {
System.out.println("Buying one object");
}
public void buy(Object... o) {
System.out.println("Buying multiple objects");
}
public static void main(String[] args) {
Consumer consumer = new Consumer();
consumer.buy(new Object());
consumer.buy("a String");
}
}
Run Code Online (Sandbox Code Playgroud)
这个类编译并运行良好.它打印两次"购买一个对象".实际上我认为会看到编译器错误,因为可以使用这两个函数.编译器如何在此处选择最佳匹配函数?当我只传递一个参数时,它会不会总是选择非varargs函数?
我有自定义的Kotlin函数:
fun getActiveCartTest(isAsync: Boolean = false, vararg callback: Callback<Cart> ): TransportResponse? {
...
}
Run Code Online (Sandbox Code Playgroud)
它具有一个默认参数(isAsync)和一个可选(vararg)回调参数。我可以像这样从Java调用此函数:
1. TransportResponse transportResponse = TransportService.INSTANCE.getActiveCartTest();
2. TransportResponse transportResponse = TransportService.INSTANCE.getActiveCartTest(false);
3. TransportResponse transportResponse = TransportService.INSTANCE.getActiveCartTest(true);
4. TransportService.INSTANCE.getActiveCartTest(true, new DefaultRestClientCallback<Cart>() {
@Override
public void onTransportResponse(@NotNull TransportResponse transportResponse) {
}
});
Run Code Online (Sandbox Code Playgroud)
很好,可以。但是,当我使用此调用时:
TransportResponse transportResponse = TransportService.INSTANCE.getActiveCartTest(true);
Run Code Online (Sandbox Code Playgroud)
我收到一个编译错误。
我的意思是。当客户端想要调用函数的异步调用时,getActiveCartTest它必须使用两个参数:isAsync AND callback。
如您在我的函数中所见,getActiveCartTest客户端可以省略第二个参数(callback)。不对
我需要第一个param isAsync = true,那么用户还必须 …