std::experimental::ranges::invoke
来自cppreference.com
                    
                                        
                    < cpp | experimental | ranges
                    
                                                            
                    |   template < class F, class... Args > std::result_of_t<F&&(Args&&...)> invoke(F&& f, Args&&... args);  | 
(范围 TS) | |
以参数 args 调用可调用 (Callable) 对象 f ,并返回结果,如同用 return INVOKE(std::forward<F>(f), std::forward<Args>(args)...); ,其中 INVOKE(f, t1, t2, ..., tN) 定义如下:
-  若 
f为类T的指向成员函数指针: 
- 若 std::is_base_of<T, std::decay_t<decltype(t1)>>::value 为 true ,则 INVOKE(f, t1, t2, ..., tN) 等价于 (t1.*f)(t2, ..., tN)
 - 否则, INVOKE(f, t1, t2, ..., tN) 等价于 ((*t1).*f)(t2, ..., tN) 。
 
-  否则,若 N == 1 且 
f为类T的指向数据成员指针: 
- 若 std::is_base_of<T, std::decay_t<decltype(t1)>>::value 为 true ,则 INVOKE(f, t1) 等价于 t1.*f 。
 - 否则, INVOKE(f, t1) 等价于 (*t1).*f 。
 
-  否则 INVOKE(f, t1, t2, ..., tN) 等价于 f(t1, t2, ..., tN) (即 
f是函数对象 (FunctionObject) )。 
参数
| f | - | 要调用的可调用 (Callable) 对象 | 
| args | - |  传递给 f 的参数
 | 
参阅
|    (C++17)(C++23)  | 
   以给定实参和可能指定的返回类型 (C++23 起)调用任意可调用 (Callable) 对象  (函数模板)  |