標籤:

請問在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 |