容器是否有重新绑定?
Is there a rebind for containers?
在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>
(
这样的事情可能会起作用:
struct A
{
};
struct B
{
};
struct C
{
};
C operator *(const A&, const B&)
{
return C();
}
template <typename Container, typename ValueType>
struct ContainerConverter
{
};
template <typename SourceValueType, typename ValueType>
struct ContainerConverter<std::vector<SourceValueType>, ValueType>
{
typedef typename std::vector<ValueType> result_type;
};
template <typename Container, typename S>
auto mult(const Container& c, const S& s)
{
typedef typename Container::value_type source_element;
typedef decltype(c.front()*s) result_element;
typename ContainerConverter<Container, result_element>::result_type result;
std::transform(c.begin(), c.end(), std::back_inserter(result), [&](const source_element& e){ return e * s; } );
return result;
}
int main()
{
std::vector<A> a;
std::vector<C> c = mult(a, B());
}
您需要为要支持的每种容器类型专门化ContainerConverter
。
如果您的容器并非全部支持std::back_inserter
请参阅 std::转换为任意容器。
相关文章:
- 我想将一个对T类型的非常量左值引用绑定到一个T类型的临时值
- 在基于范围的for循环中使用结构化绑定声明
- 使用 LuaBridge 将 LuaJIT 绑定到C++会导致"PANIC: unprotected error"
- 尝试通过OCI例程从Oracle获取blob数据,但出现错误:ORA-01008:并非所有变量都绑定
- 在使用GPU支持编译Tensorflow时,会遇到CUDA_TOOLKIT_PATH未绑定变量
- 视觉studo 2019中的漫画和静态/动态绑定
- 将自由函数绑定为类成员函数
- 将常量指针引用绑定到非常量指针
- 在派生类中绑定非静态模板化成员函数
- 绑定派生类方法C++从实例范围之外的分隔 std::function 变量调用
- 在 openGL 中多次绑定缓冲区
- 定义有趣的宏和正则表达式在Z3 C++绑定
- 使用结构化绑定'Reflection'
- 为什么 std::绑定错误参数可以成功?
- 如何绑定 C++ gRPC 客户端的网络接口
- 在 openmp 中,omp_get_thread_num是否绑定到物理线程?
- OpenGL-重新绑定已经绑定的纹理
- 尽管模板是静态绑定的,但旧代码的对象文件为什么以及如何使用使用通用编程范式的新代码
- 是否可以为现有类的实例绑定新属性,例如 c++ 中的 JavaScript?
- 部分模板绑定,将新模板创建为类型