ฉันกำลังมองหากฎที่เกี่ยวข้องกับการส่งผ่านแม่แบบ C ++ ทำหน้าที่เป็นอาร์กิวเมนต์
สิ่งนี้ได้รับการสนับสนุนโดย C ++ ดังที่แสดงในตัวอย่างที่นี่:
#include <iostream>
void add1(int &v)
{
v+=1;
}
void add2(int &v)
{
v+=2;
}
template <void (*T)(int &)>
void doOperation()
{
int temp=0;
T(temp);
std::cout << "Result is " << temp << std::endl;
}
int main()
{
doOperation<add1>();
doOperation<add2>();
}
อย่างไรก็ตามการเรียนรู้เกี่ยวกับเทคนิคนี้เป็นเรื่องยาก Googling สำหรับ "ฟังก์ชันเป็นอาร์กิวเมนต์แม่แบบ"ไม่ได้นำไปสู่อะไรมากมาย และแม่แบบ C ++ แบบคลาสสิกคู่มือฉบับสมบูรณ์ยังไม่ได้กล่าวถึงอย่างน่าประหลาดใจ (อย่างน้อยก็ไม่ใช่จากการค้นหาของฉัน)
คำถามที่ฉันมีคือไม่ว่าจะเป็น C ++ ที่ถูกต้อง (หรือเพียงบางส่วนขยายได้รับการสนับสนุนอย่างกว้างขวาง)
นอกจากนี้ยังมีวิธีให้ functor ที่มีลายเซ็นเดียวกันสามารถใช้แทนกันได้กับฟังก์ชั่นที่ชัดเจนในระหว่างการเรียกใช้เทมเพลตชนิดนี้หรือไม่?
ต่อไปนี้ไม่ทำงานในโปรแกรมข้างต้นอย่างน้อยในVisual C ++เนื่องจากไวยากรณ์ผิดอย่างเห็นได้ชัด มันจะเป็นการดีถ้าคุณสามารถสลับฟังก์ชั่นสำหรับ functor และในทางกลับกันคล้ายกับวิธีที่คุณสามารถส่งตัวชี้ฟังก์ชันหรือ functor ไปยังอัลกอริทึม std :: sort หากคุณต้องการกำหนดการดำเนินการเปรียบเทียบแบบกำหนดเอง
struct add3 {
void operator() (int &v) {v+=3;}
};
...
doOperation<add3>();
ตัวชี้ไปยังเว็บลิงค์หรือสองหรือหน้าในหนังสือ C ++ เทมเพลตจะได้รับการชื่นชม!
-std=gnu++17
แม้จะมี ฉันสามารถใช้ผลลัพธ์ของตัวดำเนินการแปลงแลมบ์ดา constexpr ที่ไม่มีตัวอักษร C ++ 17 เป็นเทมเพลตตัวชี้ฟังก์ชันที่ไม่ใช่อาร์กิวเมนต์ชนิดได้หรือไม่ .