簡體   English   中英

C ++對象中的變長參數列表

[英]Variable-length argument list in C++ object

晚上好,

我正在編寫一些類,並且有一種情況希望類方法采用可變數量的參數。 我在將其編譯時遇到了問題,因此我建立了一個非常簡單的測試用例:

TestObject.h:

#include <ostream>
#include <stdarg.h>

class TestObject
{
    public:
    void test(int intCount, ...);
};

和TestObject.cpp:

#include "TestObject.h"

void TestObject::test(int intCount, ...)
{
    va_list objList;
    va_start objStart(objList, intCount);
    int numArgs = va_arg(objList, int);
}

最后,main.cpp:

#include<stdarg.h>

int maxof(int n_args, ...)
{
    va_list ap;
    va_start(ap, n_args);
    int max = va_arg(ap, int);
    for (int i = 2; i <= n_args; i++) {
        int a = va_arg(ap, int);
        if (a > max) max = a;
    }
    va_end(ap);
    return max;
}

int main(int argc, char** argv)
{
    int max = maxof(3, 1, 3, 2);

    return 0;
}

main.cpp可以自行編譯,因此我將其范圍縮小到其中variable-length參數位於類中的情況。 當我將類添加到項目中並嘗試編譯時,構建失敗,並顯示錯誤C2065:'__crt_va_start':未聲明的標識符。 我正在Visual Studio 2015中構建。

我知道C ++具有可變參數模板,但是每當我進入模板類時,我似乎總是不得不將類和通常相關的類轉換為僅標頭文件,並且我想避免這種情況。 我可能會做的只是選擇某種通用類型的向量參數。

有人可以告訴我我是否在這里錯過什么嗎? 我應該能夠在C ++中編譯並運行一個具有可變長度參數的類方法,還是這只是不受支持的東西?

謝謝!

使用現代編譯器,您不應該退回到這種舊式省略號語法。 為了您的目的, std :: initializer_list是一個不錯的選擇。 看看其中的代碼有多簡單:

#include <limits>

int maxof(std::initializer_list<int> args)
{
    int max = std::numeric_limits<int>::min();
    for(auto arg : args)
        if(arg > max) max = arg;
    return max;
}

int main(int argc, char** argv)
{
    int max = maxof({3, 7, 1, 3, 2, 5});
    return 0;
}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM