[問題] 動態決定variadic 函數的參數個數

看板C_and_CPP作者時間11年前 (2013/07/21 23:31), 編輯推噓5(5022)
留言27則, 4人參與, 最新討論串1/2 (看更多)
開發平台(Platform): (Ex: VC++, GCC, Linux, ...) GCC 額外使用到的函數庫(Library Used): (Ex: OpenGL, ...) hiredis, C client of redis server 問題(Question): hiredis中提供了一個類似`printf`的API來傳送指令給redis server: ex: ```c reply = redisCommand(context, "SET foo %s", value); reply = redisCommand(context, "SET foo %s %s %s", value1, value2, value3); ``` 我希望後面接的參數是可以動態決定數量的。因此我想要把它包成一個繼承自 `std::ostream`的class 如此一來,要動態決定參數數量就變得很簡單: ```cpp Command << "SET foo " << value1 << value2 << value3; ``` 但是目前函式庫只有提供: void *redisvCommand(redisContext *c, const char *format, va_list ap); void *redisCommand(redisContext *c, const char *format, ...); 不知道有沒有人有用C++處理variadic function的經驗。 有一種解法是自行寫出va_list的資料結構後直接餵給`redisvCommand`, 但是這種寫法似乎不容易跨平台,所以我先不考慮。 請問有沒有人有更好的作法? -- ※ 發信站: 批踢踢實業坊(ptt.cc) ◆ From: 118.166.92.165 ※ 編輯: Wush978 來自: 118.166.92.165 (07/21 23:31)

07/21 23:34, , 1F
我覺得你就直接寫一個 stream 出來 建立字串之後直接丟給
07/21 23:34, 1F

07/21 23:35, , 2F
redisCommand 去執行就好 不需硬把 stream 蓋在 printf 上
07/21 23:35, 2F

07/21 23:36, , 3F
指令結束可以用類似 std::endl 的技巧 送它進去表示結束
07/21 23:36, 3F

07/21 23:36, , 4F
然後就可以把字串收一收送出去這樣
07/21 23:36, 4F

07/21 23:38, , 5F
我有試過,可是空白字元會出問題。
07/21 23:38, 5F

07/21 23:38, , 6F
謝謝你的建議
07/21 23:38, 6F

07/21 23:52, , 7F
阿,他有一個redisCommandArgv的API...
07/21 23:52, 7F

07/21 23:56, , 8F
不過我還是很想知道C++有沒有更好的處理va_list的方法...
07/21 23:56, 8F

07/22 00:42, , 9F
C++ 為什麼要用 variadic function....
07/22 00:42, 9F

07/22 01:28, , 10F
空白字元的問題是? 要我的話我不會去繼承 ostream
07/22 01:28, 10F

07/22 01:29, , 11F
而是在這物件裡包一個 stringstream 來收東西
07/22 01:29, 11F

07/22 01:29, , 12F
接到指令結束之後再 .str().c_str() 送給 redisCommand
07/22 01:29, 12F

07/22 01:30, , 13F
(當然 operator << 就變成自己寫一個來轉發, 不過我們有
07/22 01:30, 13F

07/22 01:30, , 14F
template 所以事情還算好解決)
07/22 01:30, 14F

07/22 01:31, , 15F
有的時候不一定要繼承才能夠有類似功能...
07/22 01:31, 15F

07/22 15:51, , 16F
@loveme00835,因為我要調用一個C 的library, 而它下指令
07/22 15:51, 16F

07/22 15:52, , 17F
是透過printf-like variadic function。希望你能建議我更
07/22 15:52, 17F

07/22 15:52, , 18F
好的作法。
07/22 15:52, 18F

07/22 15:53, , 19F
@LPH66, 因為如果我用我想把"a b"當成value儲存到server中
07/22 15:53, 19F

07/22 15:53, , 20F
透過先把指令合併成字串的話,可能會變成"LPUSH test a b"
07/22 15:53, 20F

07/22 15:54, , 21F
結果會變成list "test"內的兩個element: "a"和"b"
07/22 15:54, 21F

07/22 19:57, , 22F
這種指令架構一定會有辦法指定一個空白該不該分隔參數
07/22 19:57, 22F

07/22 19:57, , 23F
所以我覺得這應該不是個大問題
07/22 19:57, 23F

07/22 19:58, , 24F
不過我在 redis 官網翻了五分鐘沒找到關於它的說明...
07/22 19:58, 24F

07/22 20:00, , 25F
唔, 我似乎翻到有點相關的東西, 不過結論好像變成要去看看
07/22 20:00, 25F

07/22 20:00, , 26F
redisCommand 這個函式是怎麼解釋你給的字串的...
07/22 20:00, 26F

07/22 22:49, , 27F
我在他的官網有看到 C++ Client 耶
07/22 22:49, 27F
文章代碼(AID): #1Hw_x2_k (C_and_CPP)
文章代碼(AID): #1Hw_x2_k (C_and_CPP)