静的メンバー関数とメンバー関数ポインターについて読む必要があります。問題を解決する方法は3つあります。
まず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だけでなく)のメンバー関数であり、free関数をテンプレートにしたくない場合は、最近のC++11の一部である必要がありFlip
ます。標準。は、任意の種類の呼び出し可能なターゲット(フリー関数、メンバー関数、関数オブジェクトなど)で機能する汎用ポリモーフィック関数ラッパーです。C++ 11を使用できない場合、Boostライブラリには同等のとがあります。std::function
std::bind
std::function
boost::function
boost::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;
}