我正在尝试使用std::for_each()
代替普通的for
循环,但是我无法将成员函数传递给for_each()
。
代码如下:
class Class
{
public :
void func (int a)
{
cout << a * 3 << " ";
}
}ob1;
int main()
{
int arr[5] = { 1, 5, 2, 4, 3 };
cout << "Multiple of 3 of elements are : ";
for_each(arr, arr + 5, ob1);
}
仅当此成员函数为void operator() (int a)
时,该函数才有效。我不知道为什么不能将任何其他成员函数传递给for_each()
!
答案 0 :(得分:2)
您没有将任何类方法传递给for_each()
,而是传递了一个对象,该对象仅在该对象实现operator()
时有效。
要让for_each()
调用您的Class::func()
方法,您需要:
类operator()
在您的课程中:
class Class
{
public:
void func (int a)
{
std::cout << a * 3 << " ";
}
void operator()(int a)
{
func(a);
}
}ob1;
std::for_each(arr, arr + 5, ob1);
使用实现operator()
的单独委托来调用您的类。
您可以定义自定义函子(C ++ 11之前的版本):
struct functor
{
Class &obj;
functor(Class &c) : obj(c) {}
void operator()(int a)
{
obj.func(a);
}
};
std::for_each(arr, arr + 5, functor(ob1));
或使用std::bind()
(C ++ 11和更高版本):
#include <functional>
auto func = std::bind(&Class::func, &obj1, std::placeholders::_1);
std::for_each(arr, arr + 5, func);
或使用lambda(C ++ 11和更高版本):
auto func = [&](int a){ obj1.func(a); };
std::for_each(arr, arr + 5, func);
答案 1 :(得分:0)
for_each
函数有几个重载,可以看到here。
C++
-std::for_each
-Algorithm
库在标题
中定义algorithm
template< class InputIt, class UnaryFunction > UnaryFunction for_each( InputIt first, InputIt last, UnaryFunction f ); // (1) (until C++20) template< class InputIt, class UnaryFunction > constexpr UnaryFunction for_each( InputIt first, InputIt last, UnaryFunction f ); // (1) (since C++20) template< class ExecutionPolicy, class ForwardIt, class UnaryFunction2 > void for_each( ExecutionPolicy&& policy, ForwardIt first, ForwardIt last, UnaryFunction2 f ); // (2) (since C++17)
- 1)按顺序将给定的函数对象f应用于解引用范围
[first, last)
中的每个迭代器的结果。- 2)将给定的函数对象f应用于解引用范围
[first, last)
中的每个迭代器的结果(不一定按顺序)。该算法是根据策略执行的。除非std::is_execution_policy_v
<
std::decay_t
<
ExecutionPolicy
>
>
为真,否则此重载不会参与重载解析。对于两个重载,如果
iterator type
为mutable
,则f
可以通过elements
来修改range
的{{1}}。如果dereferenced iterator
返回结果,则忽略该结果。与其余算法不同,
f
不允许按顺序制作for_each
的副本,即使它们是elements
。
参数
第一,最后-
- 将功能应用于的范围
政策-
- 要使用的执行策略。有关详细信息,请参见执行策略。
f -
- 函数对象,应用于取消引用
中的每个迭代器的结果trivially copyable
- 该函数的签名应等效于以下内容:
[first, last)
- 签名不需要具有
void fun(const Type &a);
。- 类型
const &
必须使得可以解除引用类型Type
的对象,然后隐式转换为InputIt
。类型要求
Type
必须满足LegacyInputIterator的要求。InputIt
必须满足LegacyForwardIterator的要求。ForwardIt
必须满足MoveConstructible的要求。不必是CopyConstructibleUnaryFunction
必须满足CopyConstructible的要求。
这将告诉您UnaryFunction2
,predicate
或function object
满足functor
'所需条件的所有要求的最后一个参数。如果您希望避免所有类或自定义数据结构都定义for_each
,则可以编写一个通用函子来为您的类实现operator()
,或者可以使用{ {1}}。您可以参考Remy Lebeau's答案以了解实施细节。