我想学习C ++ 11目前公认的特点和我在与汽车和decltype麻烦。作为一个学习锻炼,我延长一些通用的功能性病类列表。

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)

要总结我的问题我试图找出如何定义地图,而使用模板类,并仍然有它一般在它返回的类型。

有帮助吗?

解决方案

std::list或其他std::容器派生气馁。

写您的业务免费的功能,使他们能够通过迭代器在任何标准的容器中工作。

你的意思是“定义地图,而使用模板功能”?

您应该能够使用result_typestd::function成员类型得到它的返回类型。

此外,没有必要为你指定的功能作为std::function通过。你可以把它开成任何类型,并让编译器加入一切。你只需要std::function为运行时多态性。

和使用新创建的原始堆分配对象,并通过指针返回它们是1992年SOOOO! :)

您ITER功能本质上是相同的东西作为范围 - 基于for循环

但是,一切都抛开......你的意思是这样?

template <class TFunc>
auto map(const TFunc &f) -> FList<decltype(f(_Ty()))>*
{
    auto temp = new FList<decltype(f(_Ty()))>();

    for (auto i = begin(); i != end(); i++)
        temp->push_back(f(*i));

    return temp;
}

这将匹配任何调用,和将通过使用decltype弄清楚该函数的返回类型。

请注意,它需要_Ty是默认施工的。您可以通过制造一个实例绕开这个问题:

template <class T>
T make_instance();

无需实现,因为没有生成的代码调用它,所以链接器没什么可抱怨的(感谢dribeas指出这点!)

因此,代码现在变为:

FList<decltype(f(make_instance<_Ty>()))>*

或者,从字面上看,无论的类型将是你的列表会得到从调用函数f一起_Ty的实例的引用。

和作为接受免费奖金,查找右值引用 - 这意味着你可以这样写:

std::list<C> make_list_somehow()
{
    std::list<C> result;
    // blah...
    return result;
}

和然后调用它是这样的:

std::list<C> l(make_list_somehow());

由于标准::列表将有一个“移动构造函数”(如复制构造,但选择时,自变量是暂时的,像在这里),它可以窃取的返回值的内容,即,做同样的作为最优swap。因此,有没有整个列表的复制。 (这就是为什么的C ++ 0x会让天真编写的现有代码的运行速度 - 许多受欢迎,但丑恶表演技巧将变得过时)。

和你可以得到这样的事情免费为任何现有的类你自己的,而无需编写一个正确的举动构造,通过使用unique_ptr

std::unique_ptr<MyThing> myThing(make_my_thing_somehow());

其他提示

您不能在你想要的类型的参数来推断函数的参数使用自动。您可以使用该模板。看一下: http://thenewcpp.wordpress.com/2011/10/18/该关键字,自动/ http://thenewcpp.wordpress.com/2011/10/25/ decltype和 - declval / 。他们都解释如何使用汽车和decltype。他们应该给你如何使用它们的足够信息。特别是,约make_instance另一个答案可以做与declval更好。

我觉得贾拉在他的回答提出的观点是,这些点都确切地解释了如何使用这些东西。我将反正指出的细节:

您不能做到这一点,有两个错误:

auto map(const function<auto (_Ty)>& f) -> FList<decltype(f(_Ty))>*

auto不能用于函数参数。如果你想要的功能的类型来推断,那么你应该使用模板。第二个是,decltype接受一个表达,而_Ty是一种类型。下面是如何解决这个问题:

template <typename Ret>
auto
map(const function<Ret (_Ty)>& f)
  -> FList<decltype(f(declval<_Ty>()))>
{}

这样,没有魔法创建一个类型的一个实例。

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top