所以,到目前为止我有这样的事情:
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
是默认值。我们可以安全地承担所有成员函数
我有兴趣不参与。
答案 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。