我一直在這個問題上,我已經有點成功,使升壓解釋接受成員函數,例如:
// Registers a function with the interpreter,
// will not compile if it's a member function.
template<typename Function>
typename boost::enable_if< ft::is_nonmember_callable_builtin<Function> >::type
register_function(std::string const& name, Function f);
// Registers a member function with the interpreter.
// Will not compile if it's a non-member function.
template<typename Function, typename TheClass>
typename boost::enable_if< ft::is_member_function_pointer<Function> >::type
register_function(std::string const& name, Function f, TheClass* theclass);
的enable_if語句用來防止使用錯誤的方法在編譯時。現在,你需要了解:
- 它使用了boost :: MPL解析低谷參數的參數類型調用內置的(這基本上是一個函數指針)
- 然後,在準備一個融合矢量編譯時(這是一個向量,可以同時存儲不同類型的對象)
- 當mpl完成解析每個參數時,「解析」apply方法將fork「invoke」apply方法,遵循模板。
- 主要問題是成員callable builtin的第一個參數是保存被調用方法的對象。
- 據一個我所知,MPL無法解析的不是調用內置的其他東西(即一個boost ::綁定結果)
所以,需要做的是簡單地增加一個步驟是什麼的爭論到「解析」應用,這將是將相關對象添加到應用循環!這裏有雲:
template<typename Function, typename ClassT>
typename boost::enable_if< ft::is_member_function_pointer<Function> >::type
interpreter::register_function(std::string const& name,
Function f,
ClassT* theclass);
{
typedef invoker<Function> invoker;
// instantiate and store the invoker by name
map_invokers[name]
= boost::bind(&invoker::template apply_object<fusion::nil,ClassT>
,f,theclass,_1,fusion::nil());
}
在翻譯::調用
template<typename Args, typename TheClass>
static inline
void
apply_object(Function func,
TheClass* theclass,
parameters_parser & parser,
Args const & args)
{
typedef typename mpl::next<From>::type next_iter_type;
typedef interpreter::invoker<Function, next_iter_type, To> invoker;
invoker::apply(func, parser, fusion::push_back(args, theclass));
}
這樣一來,就會簡單地跳過第一個參數類型和正確地分析一切。 該方法可以這樣調用:invoker.register_function("SomeMethod",&TheClass::TheMethod,&my_object);
該示例的register_function使用invoker :: apply函數創建一個綁定對象,fusion :: nil用於填充序列args參數fusion :: invoke requires。 它不像在該綁定中添加類ptr那麼簡單,我需要將類指針放入構建序列操作中。我假設類指針需要是序列中的第一個元素,但不是100%確定,不是很多文檔http://www.boost.org/doc/libs/1_41_0/libs/fusion/doc/html /fusion/functional/invocation/functions/invoke.html – Charles 2009-12-05 23:24:42
Alexandre Deschamps'reponse應該被標記爲正確的答案 – Catskul 2012-04-17 22:46:20