(นี่เป็นส่วนหนึ่งของการติดตามผล คำถามนี้ ของฉัน)
ตามที่ฉันได้เขียนไว้ใน คำตอบด้วยตนเองนี้ ฉันพบว่า Boost มี มาโครเพื่อ รวมฟังก์ชันเทมเพลตไว้ใน function object เพื่อให้สามารถส่งผ่านไปยังฟังก์ชันที่มีลำดับสูงกว่าได้:
#include <boost/hof.hpp>
#include <cassert>
#include <algorithm>
// Declare the class `max_f`
BOOST_HOF_LIFT_CLASS(max_f, std::max);
int main() {
auto my_max = BOOST_HOF_LIFT(std::max);
assert(my_max(3, 4) == std::max(3, 4));
assert(max_f()(3, 4) == std::max(3, 4));
}
ประเด็นก็คือสิ่งต่าง ๆ ทำงานได้ไม่ดีนักกับ MSVC และปัญหาก็เกิดขึ้นกับฉันโดยเฉพาะเมื่อพารามิเตอร์เทมเพลตบางตัวไม่สามารถอนุมานได้และต้องระบุอาร์กิวเมนต์ที่เกี่ยวข้องอย่างชัดเจน เช่นเดียวกับในกรณีของ std::get
เพียงเพื่อแสดงตัวอย่าง
สิ่งต่อไปนี้ใช้ได้กับ GCC แต่มีข้อผิดพลาดกับ MSVC
template<int N>
auto constexpr getNth_a = BOOST_HOF_LIFT(std::get<N>);
// usage
std::tuple<int,int> t{1,2};
getNth_a<0>(t); // errors with MSVC
ดังนั้นฉันจึงลอง BOOST_HOF_LIFT_CLASS
แทน แต่ฉันไม่สามารถทำงานได้เมื่อสร้างเทมเพลต แม้แต่ใน GCC:
template<int N>
BOOST_HOF_LIFT_CLASS(getNth_b, std::get<N>);
// attempted usage
std::tuple<int,int> t{1,2};
getNth_b<0>(t); // doens't even work with GCC
getNth_b
ของคุณมีลักษณะที่แตกต่างออกไป คุณใช้ผิด (และตัวอย่างควรอยู่ที่นี่ ไม่ใช่อยู่ด้านหลังลิงก์)getNth_b<0>
เป็นประเภท ดังนั้นgetNth_b<0>(t);
จึงเป็นการประกาศตัวแปร (ใหม่) (การแยกวิเคราะห์ที่น่ารำคาญที่สุด) หากต้องการสร้างอินสแตนซ์ functor และเรียกมันทันที เราจะทำgetNth_b<0> {} (t);
- person StoryTeller - Unslander Monica   schedule 13.07.2021