【发布时间】:2018-10-23 03:07:28
【问题描述】:
在C++标准库allocators可以反弹。
std::allocator<int>::rebind<double>::other 给出std::allocator<double>。
有没有一种简单的方法可以用容器做到这一点?
原因是我有一个将容器元素乘以标量的函数。
template<class Container, typename S>
auto elementwise_multiply_by_scalar(Container const& c, S s){
Container ret(c.size());
for(auto& e : ret) e *= s;
return ret;
}
但是如果e * s和e不是同一类型,我想这样做:
template<class Container, typename S>
auto elementwise_multiply_by_scalar(Container const& c, S s){
Container::rebind<decltype(Container::value_type{}*s)> ret(c.size());
auto it2 = ret.begin();
for(auto it1 = c.begin(); it1 != c.end(); ++it1, ++it2) *it2 = s * *it1;
return ret;
}
(我想不清楚为什么我希望输出与输入是同一类容器,但我想这是预期的结果。)
我可以使用模板模板参数(如template<template<typename> class V>),但它似乎也有问题。
我们需要某种container_traits<V>::rebind吗? (例如container_traits<std::vector<double, myallocator<double> >>::rebind<int>::other -> std::vector<int, myallocator<double>::rebind<int>::other>)
【问题讨论】:
-
模板参数 - 是容器类型的固有部分,即
vector<int>与vector<double>无关,函数模板使用传递给它的类型实例化。请注意,allocator::rebind返回不同类型的分配器的新实例,而您希望现有实例更改其类型。 (注意:原则上,可以编写一个可以重新绑定到不同类型的容器类,但它只会在类型更改(“显着”)时封装复制到新容器) -
使用
std::transform并收工 -
@PasserBy,是的,我可以用
std::transform实现循环,但它不能解决问题。 -
std::vector<std::variant<int, double> >可能是实现这一目标的一种方法,但我必须承认我没有使用std::variant的经验。
标签: c++ containers typetraits