2017-08-21 19 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; } 

を、私の考えはでありバッファを返すベースケースと、(再帰呼び出し後に)最初の引数をバッファに挿入する再帰的なケースを持っています。

私はのようなコードを実行した場合しかし、私は追加することができるように

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

は、どのように私は、再帰的な場合には、バッファを渡すことができます。

std::vector<uint8_t> buffer; 
pack((uint8_t)0xFF, (uint32_t)0x0A, buffer); 
hex_dump(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.cppに:(テキスト+ 0x267):。'無効パックへの未定義の参照を(スタンダード::ベクトル>&、unsigned char型、unsigned int型)」 collect2は:エラー:LDは「1つの終了ステータスを返しました。何か案が? – Shuzheng

+0

テンプレートはどこで定義されていますか?あなたがそれを使用する場所ではないcppの中で? – Jarod42

+0

私はインクルードする.hppファイルでテンプレートを宣言しましたが、.cppファイルにテンプレートを定義しました。これは正しくありませんか? – Shuzheng

関連する問題