ฉันจะใช้ BOOST_HOF_LIFT และ BOOST_HOF_LIFT_CLASS กับ MSVC ได้อย่างไร

(นี่เป็นส่วนหนึ่งของการติดตามผล คำถามนี้ ของฉัน)

ตามที่ฉันได้เขียนไว้ใน คำตอบด้วยตนเองนี้ ฉันพบว่า 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

นี่คือตัวอย่าง


person Enlico    schedule 13.07.2021    source แหล่งที่มา
comment
ปัญหา getNth_b ของคุณมีลักษณะที่แตกต่างออกไป คุณใช้ผิด (และตัวอย่างควรอยู่ที่นี่ ไม่ใช่อยู่ด้านหลังลิงก์) getNth_b<0> เป็นประเภท ดังนั้น getNth_b<0>(t); จึงเป็นการประกาศตัวแปร (ใหม่) (การแยกวิเคราะห์ที่น่ารำคาญที่สุด) หากต้องการสร้างอินสแตนซ์ functor และเรียกมันทันที เราจะทำ getNth_b<0> {} (t);   -  person StoryTeller - Unslander Monica    schedule 13.07.2021
comment
@ StoryTeller-UnslanderMonica ฉันได้รวมตัวอย่างการใช้งานไว้ในคำถามแล้ว   -  person Enlico    schedule 14.07.2021
comment
@ StoryTeller-UnslanderMonica ฉันไม่รู้ว่าทำไมฉันจึงลบสิ่งนี้ อย่างไรก็ตาม อย่าลังเลที่จะโพสต์ความคิดเห็นเป็นคำตอบ และฉันจะยอมรับมัน   -  person Enlico    schedule 22.07.2021
comment
ด้วยเหตุผลบางอย่าง ฉันเห็นว่าคำถามของฉันถูกคัดลอก ที่นี่   -  person Enlico    schedule 22.07.2021