指向成员函数问题的指针

时间:2010-03-19 23:24:23

标签: c++ templates

我正在尝试使用成员函数复制我之前使用过的模板,但它并不是很顺利。该函数的基本形式是

template<class T>
T Convert( HRESULT (*Foo)(T*))
{
    T temp;
    Foo(&temp); //Throw if HRESULT is a failure
    return temp;
}

HRESULT Converter(UINT* val)
{
    *val = 1;
    return S_OK;
}


int _tmain(int argc, _TCHAR* argv[])
{
    std::cout << Convert<UINT>(Converter) << std::endl;
    return 0;
}

对于我的生活,我无法使用成员变量。我已经阅读了他们的语法,我似乎无法弄清楚如何使它与模板一起工作。

该课程类似于

class TestClass
{ 
    HRESULT Converter(UINT* val)
    {
      *val = 1;
      return S_OK;
    }

}

2 个答案:

答案 0 :(得分:5)

TestClass是无国籍的。那么为什么要传递非静态成员函数呢?如果在实际代码中您需要访问非静态成员,则还需要传递对象

template<class T, class C>
T Convert( HRESULT (C::*Foo)(T*), C c)
{
    T temp;
    (c.*Foo)(&temp); //Throw if HRESULT is a failure
    return temp;
}

然后,您可以像下面这样调用它,假设成员函数是公开的

TestClass c;
Convert(&TestClass::Converter, c);

如果类是重量级的,或者函数在执行期间更改了其对象,则可以决定通过引用将对象传递给Convert

答案 1 :(得分:2)

这是使用std :: tr1 :: function的实现。

#include <stdlib.h>
#include <functional>
#include <iostream>
#include <winerror.h>
#include <wtypes.h>

using std::tr1::bind;
using std::tr1::function;

template <typename T>
T Convert(function<HRESULT (T*)> Converter)
{
    T temp;
    Converter(&temp);
    return temp;
}

HRESULT Converter(UINT* val)
{
    *val = 1;
    return S_OK;
}

class TestClass
{
public:
    HRESULT Converter(UINT* val)
    {
        *val = 2;
        return S_OK;
    }
};

int main()
{
    using namespace std::tr1::placeholders;

    std::cout << Convert<UINT>(Converter) << std::endl;

    TestClass converter;
    std::cout << Convert<UINT>(bind(&TestClass::Converter, converter, _1)) << std::endl;

    return EXIT_SUCCESS;
}