[英]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.