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

标签 c++ templates pointer-to-member

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

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{};
}

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

关于c++ - 具有成员函数指针的模板的默认值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47561562/

相关文章:

c++ - sprintf - 字符串前有 4 个无用的 ascii 字符

c++ - VC++ 2012 更新 5 可再发行

C++ Windows 已触发断点 - 堆损坏

c++ - 在没有 typedef 的情况下使用时显示编译错误的函数的 volatile 指针;需要帮助 w/"void (* volatile userFunc)(void)"

c++ - 如何将成员函数模板作为模板参数传递?

c++ - 如何更改结构对象的成员值? (C++ 结构初学者)

jquery - 对当前 jQuery 模板解决方案有何建议?

c++ - 使用对另一个不同类型的元组元素的非常量引用来初始化元组的元素

非具体类型的 C++ 模板特化(另一个模板类!)

c++ - 如何将指针作为另一个方法参数传递给方法