gpt4 book ai didi

c++ - 如果没有函数模板,如何使用 mem_fun_ref?

转载 作者:搜寻专家 更新时间:2023-10-31 01:53:16 25 4
gpt4 key购买 nike

我正在尝试使用 mem_fun_ref 将对象的成员函数的引用发送到另一个函数,但我得到了error C2064: term does not evaluate to a function taking 0 arguments.

我没有在示例中反射(reflect)这一点,但我需要将 mem_fun_ref_t 发送到虚函数,这就是为什么我不只是将 Flip 设为采用简单函数对象的函数模板。

#include <iostream>
#include <string>
#include <functional>

class Coin
{
public:
Coin() {}
std::string Flip ()
{
srand(23);
int side = rand() % 2 + 1;

std::string result = "";
if (side == 1)
result = "heads.";
else
result = "tails.";
return result;
}
};



std::string Flip(std::mem_fun_ref_t<std::string, Coin> flip)
{
return flip();
}



int main()
{
std::cout << "Flipping a coin..." << std::endl;
std::string output = Flip(std::mem_fun_ref<std::string, Coin>(&Coin::Flip));
std::cout << "The coin came up " << output << std::endl;
return 0;
}

最佳答案

您应该继续阅读 static member functions ,以及 member function pointers .您可以通过三种方式解决问题。

首先是使 Coin::Flip 成为静态成员函数:

#include <string>
#include <iostream>

typedef std::string (*Flipper)(); // Function pointer typedef

class Coin
{
public:
Coin() {}

// Static member function. A pointer to a static member function can be
// held in a regular function pointer.
static std::string Flip ()
{
srand(23);
int side = rand() % 2 + 1;
return (side == 1) ? "heads." : "tails.";
}
};

std::string Flip(Flipper flipper)
{
return flipper();
}

int main()
{
std::cout << "Flipping a coin..." << std::endl;
std::string output = Flip(&Coin::Flip);
std::cout << "The coin came up " << output << std::endl;
return 0;
}

如果Coin::Flip需要是一个非静态成员函数,你可以传递一个Coin实例给Flip,连同成员函数指针:

#include <functional>
#include <string>
#include <iostream>

class Coin
{
public:
Coin() {}

// Non-static member function.
std::string Flip ()
{
srand(23);
int side = rand() % 2 + 1;
return (side == 1) ? "heads." : "tails.";
}
};

typedef std::mem_fun_ref_t<std::string, Coin> Flipper;

// We need the Coin instance as well as the member function pointer.
std::string Flip(Coin& coin, Flipper flipper)
{
// Invoke the flipper member function on the coin instance
return flipper(coin);
}

int main()
{
// Since we're using a non-static member function, we need an instance
// of Coin.
Coin coin;
std::cout << "Flipping a coin..." << std::endl;
std::string output = Flip(coin, mem_fun_ref(&Coin::Flip));
std::cout << "The coin came up " << output << std::endl;
return 0;
}

最后,如果 Flipper 仿函数可以是任何类型对象(不仅仅是 Coin)的成员函数,并且您不希望 Flip 自由函数做一个模板,你需要 std::functionstd::bind这是最近的 C++11 标准的一部分。 std::function 是一个通用的多态函数包装器,适用于任何类型的可调用目标:自由函数、成员函数、函数对象等。如果您不能使用 C++11, Boost 库有等价物 boost::functionboost::bind .

#include <functional>
#include <string>
#include <iostream>

class Coin
{
public:
Coin() {}

// Non-static member function.
std::string Flip ()
{
srand(23);
int side = rand() % 2 + 1;
return (side == 1) ? "heads." : "tails.";
}

// Static member function.
static std::string StaticFlip()
{
srand(23);
int side = rand() % 2 + 1;
return (side == 1) ? "heads." : "tails.";
}
};

// Flipper is a generic function object wrapper that works with free functions,
// function objects, static member functions, and non-static member functions.
typedef std::function<std::string ()> Flipper;

std::string Flip(Flipper flipper)
{
return flipper();
}

int main()
{
// Example with non-static member function
Coin coin;

// Bind a Coin instance along with a Coin::Flip member function pointer.
Flipper flipper1 = std::bind(&Coin::Flip, &coin);

std::cout << "Flipping a coin..." << std::endl;
std::string output = Flip(flipper1);
std::cout << "The coin came up " << output << std::endl;

// Example with static member function
Flipper flipper2 = &Coin::StaticFlip;
std::cout << "Flipping a coin..." << std::endl;
output = Flip(flipper2);
std::cout << "The coin came up " << output << std::endl;

return 0;
}

关于c++ - 如果没有函数模板,如何使用 mem_fun_ref?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11416586/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com