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

Default value for template with member function pointer

到目前为止,我有这样的东西:

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 成为默认值。我们可以安全地假设所有成员函数 我有兴趣不争论。

How do I make &Foo::DoNothing() the default for 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{};
}

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

将函数更改为:

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

请注意,因为 obj 是常量,所以我实际上必须将其更改为:

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。