請問在c++11之前,有什麼方法可以實現可變參的函數模板呢?
我需要用一個類似函數指針的東西,這個「指針」要能指向參數不同的幾個函數, 我想也只能用c++11中的可變參函數模板了, 但是我的編譯器版本太低了, 不支持c++11。。。請問在c++11之前, 都是怎麼實現這種需求的呢?
你這和可變參的函數模板沒關係。你要的是std::function和各種std::bind的組合。
另外,如果編譯器老就升級編譯器。又不是百度,被鎖定版本。
方法有是有,就是把0~N個參數的情況都寫一遍,比如說 boost::function:
(裡面用了各種預處理黑科技,共用一份核心代碼)
以及 boost::bind:
(非常暴力地直接把所有情況寫出來了……)
沒有強類型的實現,請使用新版本的C++編譯器
想要模擬可變參數模板的話,本質上就是把所有個數的模板都寫一遍,可以用腳本生成。也可以使用宏的奇技淫巧。參考oceanbase開源的0.4代碼片段:https://github.com/alibaba/oceanbase/blob/master/oceanbase_0.4/src/common/ob_rpc_stub.h 注意裡面的SERIALIZE_PARAM_DEFINE(2)
cpp11前不定長參數似乎只有va_list了,就是printf那種:
Passing variable arguments to another function that accepts a variable argument list
Variable Argument Lists in C and C++
回答題目:基本等價於變參模板的實現是可能的,但是語法上不能做到11之後那麼清爽
變參模板實際上就是一個遞歸的類型列表,把這個東西實現出來其實就可以了
struct VListNil {};
template &
struct VariadicList;
template &
struct VariadicList& &> {
VariadicList(const A a, const VariadicList& tail) : value_(a), tail_(tail) {}
A value_;
VariadicList& tail_;
};
template &
struct VariadicList& {
VariadicList(const A a) : value_(a), tail_(VListNil()) {}
A value_;
VListNil tail_;
};
// construction
template &
VariadicList& Cons(const A a) {
return VariadicList&(a);
}
template &
VariadicList& &> Cons(const A a, const VariadicList& tail) {
return VariadicList& &>(a, tail);
}
// convenients
template &
VariadicList&
ConsAll(const A a) {
return Cons(a);
}
template &
VariadicList& &>
ConsAll(const A a, const B b) {
return Cons(a, Cons(b));
}
template &
VariadicList& &> &>
ConsAll(const A a, const B b, const C c) {
return Cons(a, ConsAll(b, c));
}
// and so on...
// usage:
#include &
#include &
template & 寫得不是特別嚴謹,不過表達的就是這個意思。
void PrintLines(const VariadicList& vlist) {
std::cout &<&< vlist.value_ &<&<
;
PrintLines(vlist.tail_);
}
void PrintLines(VListNil nil) {}
int main() {
PrintLines(ConsAll(std::string("Hello world"), 42, 0.5));
}
如果題主長期不能使用11後的編譯器,且對變長參數模板有需求,建議把這個東西寫成庫(正確處理VariadicList的構造函數,提供各種helper function等等),或者搜索現有的元編程實現。
libffi講道理,你的需求用可變參數模板也不行吧
套個boost::tuple湊合用?
boost::preprocessor和宏
之前的話我們是把各個長度的參數的代碼都實現一遍,一直到二十多個參數,不過是通過腳本來生成的。參考boost中的bind,最多支持9個參數吧
推薦閱讀:
※現代C++核心指導中提到的 span<T> 類型到底是哪個?
※C++ 為什麼有時候必須額外寫 template?
※C++ 模版元編程對快速開發原型有何幫助?
※c++中虛析構函數如何實現多態的、內存布局如何?
※求一本或者幾本比較詳細介紹C++11的書,《C++ Primer》是否合適?
TAG:C |