2017-08-21 51 views
0

我想提出一個可變數量的參數爲緩衝區,所以我重載<<運營商將值插入指定的緩衝區:是否有可能修復可變參數模板函數的參數?

template<typename T, typename... Args> 
void pack(T first, Args... args, std::vector<uint8_t> &buffer) { 
    pack(args ..., buffer); 
    buffer << first; 
} 

void pack(std::vector<uint8_t> &buffer) { return; } 

由於可變參數模板的功能依賴於遞歸,我的想法是有一個返回緩衝區的基例和一個將第一個參數插入緩衝區(在遞歸調用之後)的遞歸情況。

但是,如果我運行類似的代碼:

std::vector<uint8_t> buffer; 
pack((uint8_t)0xFF, (uint32_t)0x0A, buffer); 
hex_dump(buffer); 

我得到一個錯誤消息說:

In file included from main.cpp:2:0: 
./misc.hpp:20:6: note: candidate: template<class T, class ... Args> void pack(T, Args ..., std::vector<unsigned char>&) 
void pack(T first, Args... args, std::vector<uint8_t> &buffer); 
     ^~~~ 
./misc.hpp:20:6: note: template argument deduction/substitution failed: 
main.cpp:35:47: note: candidate expects 2 arguments, 3 provided 
    pack((uint8_t)0xFF, (uint32_t)0x0A, buffer); 

如何傳遞緩衝遞歸情況下,這樣我可以追加值部分填充緩衝區?

+0

可能可變參數只能是最後一個參數? –

+0

保留可變參數作爲最後一個參數 – Lefsler

回答

4
簡單

將有你的第一個參數緩衝區:

void pack(std::vector<uint8_t> &) {} 

template<typename T, typename... Args> 
void pack(std::vector<uint8_t> &buffer, T first, Args... args) { 
    buffer << first; 
    pack(buffer, args ...); 
} 

而且在C++ 17,與倍的表達,你可以直接寫:

template<typename T, typename... Args> 
void pack(std::vector<uint8_t> &buffer, Args... args) { 
    (buffer << args << ...); 
} 
+0

謝謝,但是,您的解決方案給出錯誤「/tmp/ccNl3d0x.o:在main函數中: main.cpp :(.text + 0x267):未定義的引用void package (std :: vector >&,unsigned char,unsigned int)' collect2:error:ld返回1退出狀態。任何想法? – Shuzheng

+0

你在哪裏定義了模板?在一個CPP(這不是你使用它的地方)? – Jarod42

+0

我已經聲明瞭.hpp文件中包含的模板,但在.cpp文件中定義了模板 - 這不正確嗎? – Shuzheng