之前已经问过相关问题,但我仍然没有找到满意的答案,所以我会尝试解释我的问题并希望有人能够启发我。
我目前正在使用boost :: multi_array编写一些代码,代码本身也与维度无关。我需要遍历存储在multi_array中的所有元素并使用它们执行某些操作。我希望以类似STL的方式做到这一点:
for_each(begin(array), end(array), function);
或类似的东西。其他问题让我想到了一个关于boost页面本身的例子:
for_each example
for_each implementation
这或多或少正是我想要的。当人们试图将此代码简单地导入更大的程序时,问题就出现了。人们自然希望将函数本身包装在某个命名空间中,并使用例如C ++函数作为函数对象。执行这两个中的任何一个都会为编译器创建模板查找问题。
有没有人知道如何解决模板查找问题,或者另外一种方法(希望这很漂亮)?
其他信息:
在命名空间中包装for_each定义时的编译错误
./for_each.hpp:28:3: error: call to function 'for_each' that is neither visible in the template definition nor found by
argument-dependent lookup
for_each(type_dispatch,A.begin(),A.end(),xform);
^
./for_each.hpp:41:5: note: in instantiation of function template specialization
'boost_utilites::for_each<boost::detail::multi_array::sub_array<double, 1>,
double, times_five>' requested here
for_each(type_dispatch,*begin,xform);
^
./for_each.hpp:50:3: note: in instantiation of function template specialization 'boost_utilites::for_each<double,
boost::detail::multi_array::array_iterator<double, double *, mpl_::size_t<2>, boost::detail::multi_array::sub_array<double,
1>,
boost::random_access_traversal_tag>, times_five>' requested here
for_each(boost::type<typename Array::element>(),A.begin(),A.end(),xform);
^
foreach_test.cpp:46:19: note: in instantiation of function template specialization
'boost_utilites::for_each<boost::multi_array<double, 2,
std::allocator<double> >, times_five>' requested here
boost_utilites::for_each(A,times_five());
^
./for_each.hpp:37:6: note: 'for_each' should be declared prior to the call site or in an associated namespace of one of its
arguments
void for_each (const boost::type<Element>& type_dispatch,
^
1 error generated.
在示例中使用std :: function对象而不是times_five对象时,编译错误基本相同。
使用clang版本3.4-1ubuntu3编译。
答案 0 :(得分:2)
只需
std::for_each(array.data(), array.data() + array.num_elements(), function);
要使其能够使用期望随机访问范围(使用.begin()
,.end()
和.size()
)的函数,请使用
auto elements = boost::make_iterator_range(array.data(), array.data() + array.num_elements();
// e.g.
for (auto& element : elements) {
...
}
我个人喜欢在generate_n
或fill_n
等处使用此功能:
std::for_each(array.data(), array.num_elements(), 0);
参考docs
element* data();
const element* data() const;
这将返回一个指向连续块开头的指针 包含数组的数据。如果数组的所有维度都是 0索引并以升序存储,这相当于 起源()。请注意,const_multi_array_ref仅提供const 此功能的版本。
和
size_type a.num_elements()
返回数组中包含的元素数。它等同于以下代码:
std::accumulate(a.shape(),a.shape+a.num_dimensions(), size_type(1),std::multiplies<size_type>());>