2011-11-14 46 views
0

有没有办法使用typedef作为模板函数的参数?或者一种将类型定义为参数的方法?是否可以在模板化函数签名中使用typedef?

比方说,我想给一个函数指针传递给这个函数:

template<typename C, typename ...Args> 
void test(typedef void (C::*functor)(Args... args) functor f) 
{ 
    f(args...); 
} 
+0

鸡蛋里挑骨头:我知道这很令人困惑,但指向一个成员函数既不是一个函数指针,也不是一个指针。 (有趣的相关阅读:https://blogs.msdn.com/themes/blogs/generic/post.aspx?WeblogApp=oldnewthing&y=2004&m=02&d=09&WeblogPostID=70002&GroupKeys=) –

回答

3

不,您不能在参数中创建typedef。如果你的目标是避免重复在函数体参数的类型,你可以使用decltype

template<typename C, typename ...Args> 
void test(void (C::*f)(Args...)) 
{ 
    typedef decltype(f) functor; 
} 
+0

好的,我明白了,谢谢 – codablank1

0

但是,为什么甚至想,当你可以这样写:

template<typename C, typename ...Args> 
void test(void (C::*f)(Args...), Args... args) 
{ 
    C c; //f is a member function, so need an instance of class 
    (c.*f)(args...); //call the function using the instance. 
} 

或者,您可以将该实例与参数一起传递,或者执行其他操作。我认为这只是一个概念验证,而在真实的代码中则是另一回事。

相关问题