คุณมีตัวเลือกมากมายอย่างไม่น่าเชื่อเพื่อให้ได้ผู้แทนใน C ++ นี่คือสิ่งที่อยู่ในใจของฉัน
ตัวเลือก 1: functors:
อาจมีการสร้างวัตถุฟังก์ชันโดยการนำไปใช้ operator()
struct Functor
{
// Normal class/struct members
int operator()(double d) // Arbitrary return types and parameter list
{
return (int) d + 1;
}
};
// Use:
Functor f;
int i = f(3.14);
ตัวเลือกที่ 2: การแสดงออกแลมบ์ดา ( C ++ 11เท่านั้น)
// Syntax is roughly: [capture](parameter list) -> return type {block}
// Some shortcuts exist
auto func = [](int i) -> double { return 2*i/1.15; };
double d = func(1);
ตัวเลือก 3: พอยน์เตอร์ของฟังก์ชัน
int f(double d) { ... }
typedef int (*MyFuncT) (double d);
MyFuncT fp = &f;
int a = fp(3.14);
ตัวเลือก 4: ตัวชี้ไปยังฟังก์ชันสมาชิก (วิธีที่เร็วที่สุด)
ดูFast C ++ Delegate (ในThe Code Project )
struct DelegateList
{
int f1(double d) { }
int f2(double d) { }
};
typedef int (DelegateList::* DelegateType)(double d);
DelegateType d = &DelegateList::f1;
DelegateList list;
int a = (list.*d)(3.14);
ตัวเลือกที่ 5: ฟังก์ชันมาตรฐาน ::
(หรือboost::function
ถ้าห้องสมุดมาตรฐานของคุณไม่รองรับ) มันช้ากว่า แต่ก็ยืดหยุ่นที่สุด
#include <functional>
std::function<int(double)> f = [can be set to about anything in this answer]
// Usually more useful as a parameter to another functions
ตัวเลือก 6: การรวม (ใช้std :: bind )
อนุญาตให้ตั้งค่าพารามิเตอร์บางอย่างล่วงหน้าสะดวกในการเรียกใช้ฟังก์ชันสมาชิกเช่น
struct MyClass
{
int DoStuff(double d); // actually a DoStuff(MyClass* this, double d)
};
std::function<int(double d)> f = std::bind(&MyClass::DoStuff, this, std::placeholders::_1);
// auto f = std::bind(...); in C++11
ตัวเลือก 7: เทมเพลต
ยอมรับทุกสิ่งตราบใดที่ตรงกับรายการอาร์กิวเมนต์
template <class FunctionT>
int DoSomething(FunctionT func)
{
return func(3.14);
}