有没有办法使用typedef作为模板函数的参数?或者一种将类型定义为参数的方法?是否可以在模板化函数签名中使用typedef?
比方说,我想给一个函数指针传递给这个函数:
template<typename C, typename ...Args>
void test(typedef void (C::*functor)(Args... args) functor f)
{
f(args...);
}
有没有办法使用typedef作为模板函数的参数?或者一种将类型定义为参数的方法?是否可以在模板化函数签名中使用typedef?
比方说,我想给一个函数指针传递给这个函数:
template<typename C, typename ...Args>
void test(typedef void (C::*functor)(Args... args) functor f)
{
f(args...);
}
不,您不能在参数中创建typedef
。如果你的目标是避免重复在函数体参数的类型,你可以使用decltype
:
template<typename C, typename ...Args>
void test(void (C::*f)(Args...))
{
typedef decltype(f) functor;
}
好的,我明白了,谢谢 – codablank1
号
但是,为什么甚至想,当你可以这样写:
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.
}
或者,您可以将该实例与参数一起传递,或者执行其他操作。我认为这只是一个概念验证,而在真实的代码中则是另一回事。
鸡蛋里挑骨头:我知道这很令人困惑,但指向一个成员函数既不是一个函数指针,也不是一个指针。 (有趣的相关阅读:https://blogs.msdn.com/themes/blogs/generic/post.aspx?WeblogApp=oldnewthing&y=2004&m=02&d=09&WeblogPostID=70002&GroupKeys=) –