我想知道,如果給定以下約束條件,是否可以使用可變函數/模板將可變數量的參數(其本身是函數的返回值)傳遞到可變函數中。
Constraints:
- 沒有STL/Boost/其他庫。
- No loops/recursion.
- 與C++17或更早版本兼容(除C++17外無其他內容)。
Brief example:
using fn = F(...);
fn* func = (fn*) addr;
value = (*func)(pop_t(outputstack,o_stackidx,o_stacksize)...);
push_t(outputstack,o_stackidx,o_stacksize, value);
fn*
是一個函數指針(從函數的已知user-defined內存地址轉換而來),它接受數量可變的pop_t參數(從堆棧中彈出的值),這些值(outputstack,o_stackidx,o_stacksize是靜態的,本身不需要是可變的。本質上,我想知道是否有可能讓pop_t函數重復一個可變的次數a.)根據fn
能夠接受的參數的適當數量,或者B.)使用指定重復次數的user-defined整數。
例如,假設用戶要輸入sin或atan2函數,這兩個函數分別采用不同數量的參數sin(x)和atan(y,x)。對于這兩個各自的函數,函數調用表達式如下所示:
sin -> (*func)(pop_t(outputstack,o_stackidx,o_stacksize));
atan2 -> (*func)(pop_t(outputstack,o_stackidx,o_stacksize),pop_t(outputstack,o_stackidx,o_stacksize));
具有N個參數的函數通過調用pop_t
N次從堆棧中彈出N個值。
Reproducible example:
template<class U, class I>
U pop_t(U* stack, I &stackidx, I &stacksize) {
if(stacksize>0) {
stacksize--;
stackidx = stackidx--;
return stack[stackidx];
}
else {
return stack[stackidx];
}
}
int main() {
float outputstack[2] = {3.141/2,1};
o_stackidx = 2;
o_stacksize = 2;
long addr = (long)&atan2;
using fn = F(...);
fn* func = (fn*) addr;
// Unknown variadic function pointer
value = (*func)(pop_t(outputstack,o_stackidx,o_stacksize,nt)...);
return 0;
}
看來,您希望根據參數的數量多次重復語句,在這種情況下,您可以接受C++模板的幫助:
然后你可以這樣使用它:
如果您想先自己試一試:
編輯1:要在模板的幫助下生成參數中具有
N
重復類型的函數指針類型,可以執行以下操作:首先,您需要定義這個幫助器類:
然后我們可以這樣做,
現在可以使用它來轉換僅具有
N
值的變量函數,而不必多次顯式聲明類型中的參數:編輯2:由于注釋中的OP也希望顛倒參數的順序,因此可以使用以下方法:
然后像這樣使用它:
Demo