【问题标题】:Passing pointer to any member function as class template argument将指向任何成员函数的指针作为类模板参数传递
【发布时间】:2015-10-10 02:43:34
【问题描述】:
template<typename T, typename M, M Method>
class ProxyObject
{
public:

    template<typename... Args>
    void Invoke (T& Object, _In_ Args&&... A)
    {
        (void)(Object.*Method)(std::forward<Args>(A)...);
    }
};

class Object
{
public:

    int MyMethod (int Val)
    {
        wcout << L"Hello!" << endl;
        return Val;
    }
};


int wmain ()
{
    Object myObj;
    ProxyObject<Object, decltype(&Object::MyMethod), &Object::MyMethod> obj;

    obj.Invoke(myObj, 10);

    return 0;
}

decltype(&amp;Object::MyMethod)obj 的定义中似乎是多余的。有什么办法可以让ProxyObject自动推断出被传递的指向成员函数的类型,这样我就可以定义obj如下:

ProxyObject<Object, &Object::MyMethod> obj;

【问题讨论】:

  • @cpplearner 很好。时机几乎是不可思议的。仍然希望我今天可以使用的解决方案????

标签: c++ templates


【解决方案1】:

我认为类模板是不可能的,因为你必须明确指定成员函数类型。

模板函数可以帮助您进行参数推导:

template<typename T, typename M, typename... Args>
void invoke (T& Object, M Method, Args&&... A)
{
    (void)(Object.*Method)(std::forward<Args>(A)...);
}

然后

invoke(myObj, &Object::MyMethod, 10);

LIVE

【讨论】:

  • 这很不幸。我确实希望成员函数成为类类型的一部分。感谢您的建议。
  • 类模板需要明确指定模板参数,并且有类型模板参数和非类型模板参数,所以...
猜你喜欢
  • 2013-08-11
  • 1970-01-01
  • 2018-12-07
  • 2012-07-22
  • 2013-02-15
  • 2010-11-19
  • 2020-06-09
  • 1970-01-01
相关资源
最近更新 更多