gpt4 book ai didi

c++ - 我可以在这里使用模板特化或类型强制吗?

转载 作者:搜寻专家 更新时间:2023-10-31 02:19:58 25 4
gpt4 key购买 nike

我有一个现有的模板,用于将慢速函数映射到集合(采用同名的 clojure 函数的样式),我想在这篇有用的博客文章中使用“move 语义”来加速: http://blog.knatten.org/2012/11/02/efficient-pure-functional-programming-in-c-using-move-semantics/

我写的这段旧代码对我来说效果很好:

template <typename function,
template <typename...> class collection,
typename in_type,
typename... types,
typename out_type =
typename std::result_of<function(in_type)>::type>
static collection<out_type> pmap(
const function& f, const collection<in_type, types...>& c) {
collection<out_type> result;
if(!c.empty()) {
result = collection<out_type>(c.size());
__gnu_parallel::transform(c.cbegin(),c.cend(),result.begin(),f);
}
return result;
}

因为我愿意 promise 丢弃输入集合,所以在 in_type 与 out_type 相同的情况下,我应该能够通过覆盖 c 而不是分配一个全新的集合来加快速度。我尝试了模板特化,但编译器无法在特殊情况下进行选择,而且我无法提出修复。这是我尝试的一些技巧:

template <typename function,
template <typename...> class collection,
typename in_type,
typename... types,
typename out_type =
typename std::result_of<function(in_type)>::type>
static collection<out_type> pmap(
const function& f, const collection<in_type, types...>&& c) {
collection<out_type> result;
if(!c.empty()) {
if(typeid(in_type)==typeid(out_type)) {
__gnu_parallel::transform(c.begin(),c.end(),c.begin(),f);
result = c;
}
else {
result = collection<out_type>(c.size());
__gnu_parallel::transform(c.cbegin(),c.cend(),result.begin(),f);
}
}
return std::move(result);
}

我想有一些 hack 可以让编译器接受 result=c(尽管它不应该关心,因为周围的 if 语句),但这样的转换让我感到不安。关于如何解决这个问题或为覆盖案例添加特化模板有什么建议吗?

最佳答案

typeid 是一个运行时构造,因此您要尝试在运行时而非编译时选择行为。

您可以编写两个重载并使用 std::enable_if 选择正确的重载:

template <typename function,
template <typename...> class collection,
typename in_type,
typename... types,
typename out_type =
typename std::result_of<function(in_type)>::type,
typename std::enable_if<!std::is_same<in_type, out_type>::value>::type* = nullptr>
static collection<out_type> pmap(
const function& f, collection<in_type, types...>&& c) {
collection<out_type> result;
result.reserve(c.size());
__gnu_parallel::transform(c.cbegin(),c.cend(),std::back_inserter(result),f);


return result;
}

template <typename function,
template <typename...> class collection,
typename in_type,
typename... types,
typename out_type =
typename std::result_of<function(in_type)>::type,
typename std::enable_if<std::is_same<in_type, out_type>::value>::type* = nullptr>
static collection<out_type,types...> pmap(
const function& f, collection<in_type, types...>&& c) {
__gnu_parallel::transform(c.begin(),c.end(),c.begin(),f);

return std::move(c);
}

关于c++ - 我可以在这里使用模板特化或类型强制吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33230240/

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