不用std::generate中的operator()?
No need for the operator () in std::generate?
为什么我们不在std::generate (myvector.begin(), myvector.end(), RandomNumber)
中加入operator()呢?像这样:std::generate (myvector.begin(), myvector.end(), RandomNumber())
.
代码取自 cplusplus:
int RandomNumber () { return (std::rand()%100); }
int main () {
std::srand ( unsigned ( std::time(0) ) );
std::vector<int> myvector (8);
std::generate (myvector.begin(), myvector.end(), RandomNumber);
std::cout << "myvector contains:";
for (std::vector<int>::iterator it=myvector.begin(); it!=myvector.end(); ++it)
std::cout << ' ' << *it;
函数指针和函子不是一回事
RandomNumber
是函数名。它会在这里衰减到一个函数指针。这是将可调用对象传递给 std::generate
.
等算法的一种方法
另一种方法是创建一个type,一个class,一个functor,它有一个调用运算符(operator()
)。我们也可以将这种类型的实例传递给像 std::generate
这样的算法,算法将 "call the object like a function" 而不是使用函数指针。
当我们这样做时,为了简洁起见,我们有时会将其实例化为临时的。因此,例如,这个:
Type obj;
f(obj);
很像这样:
f(Type());
(除非在这个简单的例子中最令人烦恼的解析是可疑的;忽略它:P)
因此,您正在寻找的 ()
是一个 class 实例化,当您传递函数指针而不是函子时,它是不相关的。
如果你写 RandomNumber()
,你只是调用函数 RandomNumber
并将其结果传递给 std::generate
,这不是你想要的。
为什么我们不在std::generate (myvector.begin(), myvector.end(), RandomNumber)
中加入operator()呢?像这样:std::generate (myvector.begin(), myvector.end(), RandomNumber())
.
代码取自 cplusplus:
int RandomNumber () { return (std::rand()%100); }
int main () {
std::srand ( unsigned ( std::time(0) ) );
std::vector<int> myvector (8);
std::generate (myvector.begin(), myvector.end(), RandomNumber);
std::cout << "myvector contains:";
for (std::vector<int>::iterator it=myvector.begin(); it!=myvector.end(); ++it)
std::cout << ' ' << *it;
函数指针和函子不是一回事
RandomNumber
是函数名。它会在这里衰减到一个函数指针。这是将可调用对象传递给 std::generate
.
另一种方法是创建一个type,一个class,一个functor,它有一个调用运算符(operator()
)。我们也可以将这种类型的实例传递给像 std::generate
这样的算法,算法将 "call the object like a function" 而不是使用函数指针。
当我们这样做时,为了简洁起见,我们有时会将其实例化为临时的。因此,例如,这个:
Type obj;
f(obj);
很像这样:
f(Type());
(除非在这个简单的例子中最令人烦恼的解析是可疑的;忽略它:P)
因此,您正在寻找的 ()
是一个 class 实例化,当您传递函数指针而不是函子时,它是不相关的。
如果你写 RandomNumber()
,你只是调用函数 RandomNumber
并将其结果传递给 std::generate
,这不是你想要的。