具有成员函数指针的模板的默认值
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。
到目前为止,我有这样的东西:
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 forFunc(...)
?
您基本上只需指定所需的默认参数:
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。