Re: [問題] 不定參數的函式可以放指標嗎?
※ 引述《Lepton (輕子)》之銘言:
: 問題是這樣的,我參考 <stdarg.h> 發現可以實作不定參數的函式
: 我現在想寫一個一般化函式幫我處理記憶體配置
: template<class T, int Nx>void HostMallocTest(int arg, n_pointer...)
: {
: //malloc all pointer
: Malloc( (void **) &kx, sizeof(T) * Nx);
: ....
: ....
: }
: 程式碼的示意圖大概是這樣,
: 我讀 stdarg.h 的感覺是沒辦法回傳資料,所以沒辦法處理指標
: 搜尋過版上、google沒有找到解,想請問各位有辦法實作這件事情嗎?
: 謝謝!
應該有什麼地方有誤解.
你要改變的是指標所儲存的位址,
所以應該要傳指標本身的位址或指標本身的參考進入 HostMallocTest
因為你用的是 va_list, 我想應該是無法傳參考.
要傳該指標本身的位址進入 HostMallocTest
#include <cstdarg>
template<class T, int Nx>
void HostMallocTest(int argc, ...) {
va_list argv;
va_start(argv, argc);
for (int i = 0; i < argc; ++i) {
T **val = va_arg(argv, T**);
*val = new T[Nx]; // 原本的 Malloc 用意不明, 這裡用比較合理的 new
}
va_end(argv);
}
int main() {
int *a, *b, *c;
HostMallocTest<int, 10>(3, &a, &b, &c);
return 0;
}
此外 C++ 11 應該可以用 template 的方式在編譯期取代:
template<int Nx>
void HostMallocTest() {}
template<int Nx, class T, class...Targs>
void HostMallocTest(T **arg, Targs... args) {
*arg = new T[Nx];
HostMallocTest<Nx>(args...);
}
int main() {
int *a, *b, *c;
HostMallocTest<10>(&a, &b, &c);
return 0;
}
--
[編輯補充]
或者在 C++11 用 initializer_list 替代 va_list 的功能:
#include <initializer_list>
template<int Nx, class T>
void HostMallocTest(std::initializer_list<T **> l) {
for (auto p : l) {
*p = new T[Nx];
}
}
int main() {
int *a, *b, *c;
HostMallocTest<10>({&a, &b, &c});
return 0;
}
--
很多小地方要改, 但是概念上這樣應該沒錯?
--
※ 發信站: 批踢踢實業坊(ptt.cc)
◆ From: 140.112.29.148
※ 編輯: Feis 來自: 140.112.29.148 (01/16 20:13)
推
01/16 21:05, , 1F
01/16 21:05, 1F
→
01/16 21:07, , 2F
01/16 21:07, 2F
→
01/16 21:09, , 3F
01/16 21:09, 3F
→
01/16 21:10, , 4F
01/16 21:10, 4F
→
01/16 21:11, , 5F
01/16 21:11, 5F
→
01/16 22:01, , 6F
01/16 22:01, 6F
→
01/16 22:07, , 7F
01/16 22:07, 7F
※ 編輯: Feis 來自: 140.112.29.148 (01/16 22:18)
→
01/16 22:20, , 8F
01/16 22:20, 8F
推
01/20 09:26, , 9F
01/20 09:26, 9F
討論串 (同標題文章)
C_and_CPP 近期熱門文章
PTT數位生活區 即時熱門文章