我想弄清楚如何創建一個C++ 11模板函數,它可以在兩個約定之間轉換函數調用:第一個使用Variant(注意:變體是一個多態類型,它是子類IntVariable,DoubleVariant等的基礎),第二個是C函數調用。C++ 11 variadic模板函數調用轉發
我們知道編譯時的每一條信息:參數count是參數個數,參數/返回類型取決於'cfunc'變量類型。
// We will assume that the two following functions are defined with their correct
// specializations.
template < typename T >
Variant * convertToVariant(T t);
template < typename T >
T convertFromVariant(Variant * variant);
// The following function is incomplete, the question is how to convert the
// variant parameters into a C function call ?
template < typename Return, typename... Arguments >
Variant * wrapCFunction< Return cfunc(Args...) >(int argc, Variant ** argv) {
// Here comes the magic call of cfunc, something like :
if (argc != mpl::count<Args...>::value)
throw std::runtime_error("bad argument count");
return cfunc(convertFromVariant<Args...>(argv[ X ])...);
}
// Example use case :
int foo(int a, int b);
int main(void) {
int argc = 2;
Variant * argv[2] = { new IntVariant(5), new IntVariant(6) };
Variant * res = wrapCFunction<foo>(argc, argv);
IntVariant * intRes = dynamic_cast<IntVariant>(res);
return intRes ? intRes->value : -1;
}
出於好奇,爲什麼地球上會需要運行時變體而不是編譯時間, [Boost.Variant](http://www.boost.org/libs/variant/)? – ildjarn
@ildjarn我正在使用運行時變體來保存動態語言的運行時庫中的值(如Zend引擎中的ZValues)。 –
最佳答案我能想象,只是想我會問。 : - ] – ildjarn