标签: variadic-functions

当获取float类型的参数时,Variadic C++函数不起作用

我有一个可变参数模板函数:

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++ templates variadic-functions

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

鉴于Java对可变参数的有限启示,它们有什么好处?

我来自C(++)背景,我对Java的主要兴趣是Android开发.对我来说,这似乎是一个显而易见的问题,但我还没有发现它在任何地方都得到了解决(我确实搜索了stackoverflow并谷歌).我找到的是很多评论,例如:

public String foo(String key, Object[] parameters) {..}

and
Run Code Online (Sandbox Code Playgroud)

public String foo(String key, Object... parameters) {..}

are equal
Run Code Online (Sandbox Code Playgroud)

实际上,"Varargs"的java文档明确指出"最后一个参数类型之后的三个句点表明最终参数可以作为数组或参数序列传递"

从同一来源,最常说的理由是,varargs具有"核心API中的重要用途,包括反射,消息格式化和新的printf工具".

鉴于Java是面向对象的,包括垃圾收集并支持动态数组 Java varargs仅限于单一类型,这有什么优势?(与之相反,例如,C实现了附加功能.)

java variadic-functions

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

变量函数 - 如何获取var_args的数量?

这可以完成吗?有没有,例如,某种va_num_args

基本上,我以prinf()类似的方式在串行端口上记录事件,采用格式字符串,并且可选地,使用一些参数.我想知道是否存在任何此类选项参数.

我可以区分Trace("No paramters here");Trace("forty two = %d", 43 - 1);吗?

c variadic-functions

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

带有可变参数(...)的C++方法报告错误的arg值

我无法将变量参数正确传递给方法 - 该方法旨在选择加权分布中的随机值并返回所选结果的索引.

一个示例用法是:

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)

c++ variadic-functions

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

Clang抱怨POD类实际上是非POD

更新:我在这里修改了代码,以便您可以直接插入并尝试编译.

Clang 3.4.1(LLVM 3.4)抱怨我的类在可变参数函数中使用时不是POD类型(据我能说的最多).G ++编译没有问题.

即使按照C++ 03的标准,这个类也是POD:

  • 它只包含PODS作为成员
  • 没有用户定义的析构函数
  • 没有用户定义的复制赋值运算符
  • 没有指向成员类型的非静态成员

而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++ llvm clang variadic-functions c++11

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

vprintf是如何实现的?

如果想在C中编写一个函数,将一个变量参数列表传递给printf一个必须使用该vprintf版本的函数.如何为自定义函数实现此机制?

换句话说,如何是什么套的精髓vprintf除了printf在符合标准的C语言实现?

c variadic-functions

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

在Java中可以使用数组varargs吗?

我试图实现一个方法来合并任意数量的数组.

@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)

java variadic-functions

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

如何将接口作为varargs参数传递给Groovy中的方法?

有没有办法将接口作为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]

我需要改变什么?

groovy variadic-functions

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

Java:允许使用一个varargs参数和具有相同名称的函数和一个相同类型的参数的函数?

在准备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函数?

java overloading variadic-functions function-binding

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

如果第一个参数为true,则必须在函数中传递第二个参数

我有自定义的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,那么用户还必须 …

arguments variadic-functions kotlin

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