gpt4 book ai didi

c++ - 我可以默认此 Transform 模板函数的返回类型吗?

转载 作者:行者123 更新时间:2023-11-30 02:37:15 25 4
gpt4 key购买 nike

目前,要使用以下...

template< class ResultCollection, class Collection, typename Transformation >
ResultCollection Transform(const Collection& c, Transformation t)
{
ResultCollection result(c.size());
transform(c.begin(), c.end(), result.begin(), t);
return result;
}

...您需要提供返回类型:

auto result = Transform< std::vector<int> >( someInputCollection, [] (SomeType& element) { return ElementToInt(element); });

是否可以默认模板参数,以便默认情况下您将获得一个 vector ,其中包含 lambda 返回的任何类型的元素?

我做到了:

template< class Collection, typename Transformation, class ResultCollection = std::vector< std::result_of_t<Transformation> > >
ResultCollection Transform(const Collection& c, Transformation t)
{
ResultCollection result(c.size());
transform(c.begin(), c.end(), result.begin(), t);
return result;
}

但这给了我这个:

C2783: 'ResultCollection Transform(const Collection &,Transformation)' : could not deduce template argument for 'ResultCollection'

而且我不确定如何修复它。

最佳答案

您的代码有两个问题。第一个缺少 typename:

class ResultCollection = std::vector< typename std::iterator_traits<typename Collection::iterator>::value_type > 
^^^^^^^^ ^^^^^^^^

但第二个是您传递的类型完全错误!如果您的 Transformation 实际上没有更改集合的值类型,那一切都很好,但如果它这样做了呢?

std::vector<char> collection;
auto result = Transform(collection, [](char c) { return std::string(c, 1); });

您需要生成的 vector 包含 Transformation 给出的类型:

class ResultCollection = std::vector<
std::result_of_t<Transformation(decltype(*std::declval<Collection>().begin()))>
>

而且,顺便说一句,如果该结果类型不可默认构造怎么办?你假设它在这里:

ResultCollection result(c.size());

可能想改为这样做:

ResultCollection result;
result.reserve(c.size());
std::transform(c.begin(), c.end(), std::back_inserter(result), t);

或者真的:

ResultCollection result;
result.reserve(c.size());
for (const auto& elem : c) {
result.push_back(t(elem));
}

关于c++ - 我可以默认此 Transform 模板函数的返回类型吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31866017/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com