我理解了使用可变模板参数的递归性质和特定模板实例化的基本概念,以便逐个"吃"遍历参数列表。
我理解lambda可以被编写为接受某些类型,然后返回某些类型。请记住,我还在学习c++ 14和c++ 11,所以我还没有掌握其中一个。
这是我在看了其他堆栈溢出问题后的尝试:
// For std::string
#include <string>
// For std::cout
#include <iostream>
//Create a generalized list instantiation
template <typename ... F>
struct overload : public F... {
overload(F... f) : F(f)... {}
};
//Create an specific end-case, where we directly
//inherit the () operator in order to inherit
//multiple () overloads
template <typename F>
struct overload : F {
using F::operator();
};
//template function to create an overload
template <class... F>
auto make_overload(F... f) {
return (f...);
}
int main() {
auto f = [](int x,int y) -> int {
return x+y;
};
auto g = [](double x,double y) -> int {
return std::ftoi(x+y);
};
auto h = [](std::string x,std::string y) -> int {
return std::stoi(x+y);
};
//Ah, but this is a function.
auto fgh = make_overload(f,g,h);
std::cout << (fgh(1,2)) << std::endl;
std::cout << (fgh(1.5,2.5)) << std::endl;
std::cout << (fgh("bob","larry")) << std::endl;
}
Coliru: http://coliru.stacked-crooked.com/a/5df2919ccf9e99a6
我在概念上遗漏了什么?其他答案可能在表面上简洁地回答了这个问题,但我正在寻找一个解释,为什么答案逃避了我的想法。如果我知道我需要做using F::operator()
来继承操作符,并且我正确地声明返回值和参数类型不同,那么我还需要做什么才能使其工作?
这是我的思路:
- 创建一个通用的可变模板基类。
- 创建一个特定的模板案例来重载特定lambda的
operator()
。 - 创建一个辅助函数来获取可变模板参数列表,然后使用它来构造"overload"类。
- 确保类型是明确的。
你实际上没有递归。
// primary template; not defined.
template <class... F> struct overload;
// recursive case; inherit from the first and overload<rest...>
template<class F1, class... F>
struct overload<F1, F...> : F1, overload<F...> {
overload(F1 f1, F... f) : F1(f1), overload<F...>(f...) {}
// bring all operator()s from the bases into the derived class
using F1::operator();
using overload<F...>::operator();
};
// Base case of recursion
template <class F>
struct overload<F> : F {
overload(F f) : F(f) {}
using F::operator();
};