紧接上文,我们发现一个问题, 我们只能使用函数式对象, 而不能用已经存在的函数,下面讲讲如何解决这个问题
#include <iostream>
#include <utility>
#include <string>
#include <string.h>
#include <vector>
#include <map>
#include <set>
#include <stack>
#include <queue>
#include <unordered_map>
#include <unordered_set>
#include <algorithm>
#include <numeric>
using namespace std;
template<typename T, class F>
auto operator|(T &¶m, F &&f) -> decltype(std::forward<F>(f)(std::forward<T>(param))) {
return (std::forward<F>(f)(std::forward<T>(param)));
}
auto myMap = [](auto&& nums, auto&& f) {
transform(nums.begin(), nums.end(), nums.begin(), f);
return nums;
};
auto add_one = [](int data) {
return ++data;
};
auto print_one = [](int data) {
cout << data << endl;
return data;
};
int add(int i) {
return i + 1;
}
#define define_functor_type(func_name) \
class func_name##_wrapper { \
public: \
template<typename ...Args> \
decltype(auto) operator()(Args&& ...args){ \
return func_name(std::forward<Args>(args)...); \
} \
static func_name##_wrapper& getInstance() {\
static func_name##_wrapper wrapper; \
return wrapper; \
} \
private: \
func_name##_wrapper(){} \
\
};
#define define_and_instantiation(name, F) \
define_functor_type(F) \
auto&& name = F##_wrapper::getInstance();
define_and_instantiation(wrappr, add);
//define_functor_type(add);
//add_wrapper wrapper;
int main() {
vector<int> res = {1, 2, 3, 4, 5};
auto v = myMap(res, wrappr);
myMap(v, print_one);
}