2

我正在研究模板专业化中函数类型的使用,我想知道是否有成员函数类型之类的东西(不是在谈论成员函数指针)。

导致我提出这个问题的案例可以通过一个例子更好地解释......

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;
4

3 回答 3

1

该语法void(Object::*)()定义了指向成员函数的指针类型。C++中没有成员函数类型。

理论上,您可以使用 获得成员函数类型std::remove_pointer<void(Object::*)()>::type,但这不是有效的 C++。的文档boost::remove_pointer记录了这一点。

指向成员函数类型的指针T (C::*)()是通过将函数类型T()指向成员类型的指针相结合而产生的T C::*。请参阅此答案以了解此组合的工作原理。

您可以使用简单的帮助模板执行此组合:

template<typename C, typename T>
struct PointerToMember
{
    typedef T C::* Type;
};

typedef PointerToMember<Object, void()>::Type Type; // void(Object::*)()

Function这在扩展以支持指向成员的指针时可能很有用。

于 2013-10-04T14:53:14.627 回答
0

在 C++11 中有decltype,它可以为您提供表达式的类型,例如decltype ObjectType::DoSomething在您的情况下,而不是ObjectType::ReturnType(). 这样做的老派方法是要求struct Object包含具有特定名称的成员类型,例如ReturnType, 并且您只需使用typename ObjectType::ReturnType(不带括号)。

于 2013-10-04T14:48:29.173 回答
-1

“C++ 中不存在成员函数类型。”

我想这几乎回答了我的问题。谢谢 :)

于 2013-10-04T15:05:24.333 回答