带有成员函数指针的模板的默认值

时间:2017-11-29 20:48:55

标签: c++ templates member-function-pointers

所以,到目前为止我有这样的事情:

struct Foo { int DoNothing() { } };

template<typename T, typename C, typename R>
T Func(C const* obj,
       R (C::*mf)(),
       T* maybe_unused = nullptr)
{
    (obj->*mf)();
    return T{};
}

Foo f;
int r = Func<int>(&f, &Foo::DoNothing); // works as expected

如何&Foo::DoNothing() Func(...)的默认设置? IOW,我想通过Foo的其他一些成员函数 在另一个时间,但在大多数情况下,我希望DoNothing 是默认值。我们可以安全地承担所有成员函数 我有兴趣不参与。

2 个答案:

答案 0 :(得分:2)

  

如何将&Foo::DoNothing()作为Func(...)的默认设置?

您基本上只需指定所需的默认参数:

struct Foo { int DoNothing() const { } };

template<
  typename T, 
  typename C, 
  typename R = decltype(std::declval<const C>().DoNothing())
>
T Func(C const* obj,
       R (C::*mf)() const = &C::DoNothing,
       T* maybe_unused = nullptr)
{
    (obj->*mf)();
    return T{};
}

请注意,您需要指定两个不同的东西:一个是要调用的默认成员函数,另外一个是默认的返回值类型,因为它不能从默认参数中推断出来。

答案 1 :(得分:0)

将Func更改为:

template<typename T, typename R, typename C>
T Func(C const* obj, R (C::*mf)()=&C::do_nothing, T* maybe_unused = nullptr)
{
...
}

请注意,因为obj是const我实际上必须将其更改为:

template<typename T, typename R, typename C>
T Func(C const* obj, R (C::*mf)() const=&C::do_nothing, T* maybe_unused = nullptr)
{
...
}

我将do_nothing()更改为const。