c++ - 作为模板参数的成员函数和 c++17 等价物

标签 c++ templates c++17 auto member-functions

在 clang 4.0 中,利用 c++17 auto 模板参数,我现在可以编写这样的函数(事实证明这在很多情况下都非常有用):

template<auto member_function, typename OBJECT>
auto call_member_fct(OBJECT object){
    return (object.*member_function)()
}

(G++ >= 7 提供了相同的可能性,但我没有测试过)

这个函数有一个有用的特性,你可以用一个模板参数调用它,实际的成员函数:

call_member_fct<&action::count>(action())

不幸的是 vs2017 不允许这样做。 是否有一种语法解决方法允许在 vs2017 中使用具有单个 模板参数的相同调用,并自动扣除函数签名和对象?

最佳答案

并非完全 100% 相同,但应该适用于大多数情况。您可以让成员函数有一个参数:

template <class T, class Ret>
auto yolo(auto (T::* mem) () -> Ret, T& obj)
{
    return (obj.*mem)();
}

这样调用:

struct X { auto foo() { return 24; }};

auto test()
{
    X x;
    return yolo(&X::foo, x);
}

关于c++ - 作为模板参数的成员函数和 c++17 等价物,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44319899/

相关文章:

c++ - move 由逗号运算符抑制的构造函数

javascript - 如何从全局范围访问 Angular 应用程序的 $templateCache?

c++ - 为什么原始 curl 构造函数 {} 不返回右值?

c++ - 并发 TS:std::future<...>::then,如何在不存储返回的 future 的情况下保持链条事件?

c++ - c++17 中的 STL 容器是否有三向比较

c++ - AMQP-CPP - 基于事件的方法

python - boost python : tie lifetime of argument to returned value using return_internal_reference

c++ - 重载函数声明的顺序在 C++ 中重要吗?

c++ - CRTP 和基类定义的类型的可见性

c++ - 具有 lambda 的多态访问者