我正在尝试学习当前接受的 c++11 功能,但我在使用 auto 和 decltype 时遇到了问题。作为一项学习练习,我正在使用一些通用函数扩展 std 类列表。
template<class _Ty, class _Ax = allocator<_Ty>>
class FList : public std::list<_Ty, _Ax>
{
public:
void iter(const function<void (_Ty)>& f)
{
for_each(begin(), end(), f);
}
auto map(const function<float (_Ty)>& f) -> FList<float>*
{
auto temp = new FList<float>();
for (auto i = begin(); i != end(); i++)
temp->push_back(f(*i));
return temp;
}
};
auto *ints = new FList<int>();
ints->push_back(2);
ints->iter([](int i) { cout << i; });
auto *floats = ints->map([](int i) { return (float)i; });
floats->iter([](float i) { cout << i; });
对于成员映射,我希望返回类型是通用的,具体取决于传递的函数返回的内容。所以对于返回类型,我可以做这样的事情。
auto map(const function<float (_Ty)>& f) -> FList<decltype(f(_Ty))>*
这还需要删除函数模板中的浮点类型。
auto map(const function<auto (_Ty)>& f) -> FList<decltype(f(_Ty))>*
我可以使用模板类,但这会使实例的使用更加冗长,因为我必须指定返回类型。
template<class T> FList<T>* map(const function<T (_Ty)>& f)
总而言之,我试图弄清楚如何在不使用模板类的情况下定义地图,并且仍然在它返回的类型中具有通用性。