将动态函子传递给stl
Passing dynamic functor to stl
我对c++还比较陌生,这是我的第一篇文章,所以请温柔;-)
我了解如何传递函数指针或函数对象,就像许多stl函数所需要的那样。我不清楚如何将其与继承结合使用。
具体来说,我想调用一个带有几个从基函子继承的函子的stl函数。我没有找到任何关于这个主题的相关评论或最佳做法。这里有一个简化的代码片段:
struct generator{
virtual int operator()() = 0;
virtual ~generator(){};
};
struct A : public generator{
int operator()();
};
struct B : public generator{
int operator()();
};
int main()
{
auto v = std::vector<std::array<int, 500>>(2);
std::array<std::shared_ptr<generator>, 2> functors = {{std::make_shared<A>(),
std::make_shared<B>()}};
for (size_t i = 0; i < functors.size(); ++i)
std::generate(std::begin(v[i]), std::end(v[i]),
*(functors[i]));
return 0;
}
编译这个给出:
clang++ -std=c++11 -g -Wall -Wextra test_stackoverflow.cpp
test_stackoverflow.cpp:25:5: error: no matching function for call to 'generate'
std::generate(std::begin(v[i]), std::end(v[i]),*(functors[i]));
^~~~~~~~~~~~~
/usr/lib/gcc/i686-linux-gnu/4.6/../../../../include/c++/4.6/bits/stl_algo.h:5003:5: note: candidate template ignored: substitution
failure [with _ForwardIterator = int *, _Generator = generator]: parameter type 'generator' is an abstract class
generate(_ForwardIterator __first, _ForwardIterator __last,
是的,*(函子[i])的类型是生成器。这将不允许动态访问A::operator()和B::运算符()。我知道如何(勉强)解决这个问题。例如
std::generate(std::begin(v[i]), std::end(v[i],
[&]{ return functors[i]->operator()(); };
然而,这似乎相当模糊,我正在寻找一种更清晰的方式来实现我的目标。
通常如何传递这样的动态函子。或者,如果对此表示反对,那么最好的选择是什么?
欢迎任何帮助或建议。
您可能已经知道,问题是std::generate
按值获取生成器。要传递多态对象,必须通过引用传递。
在c++11中,这类问题有一个解决方案(除了lambda选项,我相信它仍然比我们在c++11中之前的选项更优雅)。解决方案为std::ref。它返回一个可以通过值传递的引用包装器。
这应该对你有用:
std::generate(std::begin(v[i]), std::end(v[i]),
std::ref(*(functors[i])));
您之所以可以将引用包装器作为函数传递,是因为它们实现了operator()
相关文章:
- 在C++STL中是否有Polyval(Matlab函数)等价物?
- std::向量与传递值的动态数组
- 在c++中用vector填充一个简单的动态数组
- C++中的动态铸造故障
- 如果C++类在类方法中具有动态分配,但没有构造函数/析构函数或任何非静态成员,那么它仍然是POD类型吗
- 为什么这个运算符<重载函数对 STL 算法不可见?
- 内联映射初始化的动态atexit析构函数崩溃
- 使用动态分配的数组会导致代码分析发出虚假的C6386缓冲区溢出警告
- 删除包含包含动态对象的 STL 容器的智能指针
- c ++ stl 库容器具有动态内存分配
- STL和元素插入中列表的动态分配
- 没有stl和动态内存分配的成员函数类
- 没有STL的C++动态数组
- 将动态函子传递给stl
- Stl c++ 动态内存分配
- 初始化哈希表的 stl 列表动态数组(单独链接)
- 动态初始化并使用C++STL列表的数组
- 适合于查找动态有序列表中的第n个元素的c++ STL容器
- STL push_back:在推送动态变化的数组时修改以前的值
- 用STL算法排序结构的动态数组