我正在研究模板特化中函数类型的用法,我想知道是否存在成员函数类型(不是成员函数指针)。
引导我解决这个问题的案例可以通过一个例子来解释......
template< typename FunctionType >
struct Function; // Undefined
// Specialize for functions with 0 parameter...
template< typename ReturnType >
struct Function< ReturnType() > // Notice the unusual syntax here...
{
// Function pointer that fits the signature of the template...
ReturnType (*m_pointerToFunction)();
};
// Specialize for functions with 1 parameter...
template< typename ReturnType, typename ParameterType >
struct Function< ReturnType(ParameterType) >
{
ReturnType (*m_pointerToFunction)(ParameterType);
};
// ... etc up to a certain number of parameter.
// To use this template:
void SomeFunctionTakingNoParameter()
{
}
Function< void() > test;
test.m_pointerToFunction = SomeFunctionTakingNoParameter;
现在我想做的是为成员函数创建专门化。我尝试的第一件事是:
template< typename ReturnType, typename ObjectType, typename ParameterType >
class Function< ObjectType, ReturnType(ParameterType) >
{
ReturnType (ObjectType::*m_memberFunctionPointer)(ParameterType);
};
我这样用它:
struct Object
{
void DoSomething()
{
}
};
Function< Object, void() > function;
function.m_memberFunctionPointer = &Object::DoSomething;
我必须为模板提供2个参数(对象类型和签名)。我想看看是否有办法在一个参数中完成所有操作。
下一位没有编译,但我想知道该语言中是否有类似内容?
template< typename ObjectType, typename ReturnType >
struct Function< ObjectType::ReturnType() >
{
ReturnType (ObjectType::*m_memberFunctionPointer)();
};
Function< Object::void() > function;
function.m_memberFunctionPointer = &Object::DoSomething;
答案 0 :(得分:1)
语法void(Object::*)()
定义了指向成员函数的指针类型。在C ++中没有成员函数类型的东西。
理论上,您可以使用std::remove_pointer<void(Object::*)()>::type
获取成员函数类型,但这不是有效的C ++。 boost::remove_pointer
的文档记录了这一点。
指向成员函数的指针类型T (C::*)()
是通过将函数类型T()
与指针相结合而生成的 - 成员类型T C::*
。有关此组合的工作原理,请参阅this answer。
您可以使用简单的帮助程序模板执行此组合:
template<typename C, typename T>
struct PointerToMember
{
typedef T C::* Type;
};
typedef PointerToMember<Object, void()>::Type Type; // void(Object::*)()
在将Function
扩展为支持指向成员的指针时,这可能很有用。
答案 1 :(得分:0)
在C ++ 11中有decltype
,它可以为您提供表达式的类型,例如:在您的情况下decltype ObjectType::DoSomething
,而不是ObjectType::ReturnType()
。老式的方法是要求struct Object
包含具有特定名称的成员类型,例如ReturnType
,并且您只需使用typename ObjectType::ReturnType
(不带括号)。
答案 2 :(得分:-1)
“C ++中没有成员函数类型。”
我想这几乎可以回答我的问题。谢谢:))