มีคำตอบที่ดีอยู่แล้วดังนั้นฉันจะตอบคำถามของคุณบางส่วน กล่าวคือฉันรู้สึกไม่มั่นใจกับคำถามของคุณเนื่องจาก OOP และคุณลักษณะการใช้งานนั้นไม่ได้เกิดขึ้นพร้อมกัน
หากคุณใช้ C ++ 11 มีคุณสมบัติการเขียนโปรแกรมฟังก์ชั่นหลายประเภทที่สร้างขึ้นในไลบรารีภาษา / มาตรฐานที่ทำงานร่วมกันได้ดีกับ OOP แน่นอนว่าฉันไม่แน่ใจว่าเจ้านายหรือเพื่อนร่วมงานของคุณจะได้รับ TMP เพียงใด แต่ประเด็นก็คือคุณจะได้รับคุณสมบัติเหล่านี้มากมายในบางรูปแบบหรืออย่างอื่นในภาษาที่ไม่ทำงาน / OOP เช่น C ++
การใช้แม่แบบที่มีการรวบรวมเวลาย้อนกลับอาศัย 3 จุดแรกของคุณ
- การเปลี่ยนไม่ได้
- recursion
- การจับคู่รูปแบบ
ในเทมเพลต - ค่านั้นไม่สามารถเปลี่ยนแปลงได้ (ค่าคงที่เวลาคอมไพล์) การวนซ้ำใด ๆ จะกระทำโดยใช้การเรียกซ้ำและการแยกย่อยจะกระทำโดยใช้การจับคู่รูปแบบ (มากหรือน้อย) ในรูปแบบของการแก้ไขโอเวอร์โหลด
สำหรับประเด็นอื่น ๆ การใช้std::bind
และstd::function
ให้แอปพลิเคชั่นบางส่วนแก่คุณและพอยน์เตอร์ฟังก์ชั่นนั้นมีอยู่ในภาษา วัตถุที่เรียกใช้ได้เป็นวัตถุที่ใช้งานได้ โปรดทราบว่าด้วยวัตถุ callable operator ()
ผมหมายถึงคนที่กำหนดของพวกเขา
การประเมินที่ขี้เกียจและฟังก์ชั่นที่บริสุทธิ์จะยากขึ้นเล็กน้อย สำหรับฟังก์ชั่นที่บริสุทธิ์คุณสามารถใช้ฟังก์ชั่นแลมบ์ดาซึ่งจับตามมูลค่าเท่านั้น แต่ไม่เหมาะ
สุดท้ายนี่คือตัวอย่างของการใช้การเรียกซ้ำเวลาคอมไพล์ด้วยแอปพลิเคชันฟังก์ชันบางส่วน มันเป็นตัวอย่างที่มีการวางแผนมาบ้าง แต่มันแสดงให้เห็นถึงประเด็นข้างต้นส่วนใหญ่ มันจะผูกค่าซ้ำใน tuple ที่กำหนดให้กับฟังก์ชั่นที่กำหนดและสร้างวัตถุฟังก์ชั่น (callable)
#include <iostream>
#include <functional>
//holds a compile-time index sequence
template<std::size_t ... >
struct index_seq
{};
//builds the index_seq<...> struct with the indices (boils down to compile-time indexing)
template<std::size_t N, std::size_t ... Seq>
struct gen_indices
: gen_indices<N-1, N-1, Seq ... >
{};
template<std::size_t ... Seq>
struct gen_indices<0, Seq ... >
{
typedef index_seq<Seq ... > type;
};
template <typename RType>
struct bind_to_fcn
{
template <class Fcn, class ... Args>
std::function<RType()> fcn_bind(Fcn fcn, std::tuple<Args...> params)
{
return bindFunc(typename gen_indices<sizeof...(Args)>::type(), fcn, params);
}
template<std::size_t ... Seq, class Fcn, class ... Args>
std::function<RType()> bindFunc(index_seq<Seq...>, Fcn fcn, std::tuple<Args...> params)
{
return std::bind(fcn, std::get<Seq>(params) ...);
}
};
//some arbitrary testing function to use
double foo(int x, float y, double z)
{
return x + y + z;
}
int main(void)
{
//some tuple of parameters to use in the function call
std::tuple<int, float, double> t = std::make_tuple(1, 2.04, 0.1);
typedef double(*SumFcn)(int,float,double);
bind_to_fcn<double> binder;
auto other_fcn_obj = binder.fcn_bind<SumFcn>(foo, t);
std::cout << other_fcn_obj() << std::endl;
}