ฉันต้องการผ่านตัวชี้ฟังก์ชั่นจากอาร์เรย์ของตัวชี้ฟังก์ชั่นเป็นอาร์กิวเมนต์แม่แบบ รหัสของฉันดูเหมือนว่าจะรวบรวมโดยใช้ MSVC แม้ว่า Intellisense บ่นว่ามีบางอย่างผิดปกติ ทั้ง gcc และ clang ไม่สามารถคอมไพล์โค้ดได้
ลองพิจารณาตัวอย่างต่อไปนี้:
static void test() {}
using FunctionPointer = void(*)();
static constexpr FunctionPointer functions[] = { test };
template <FunctionPointer function>
static void wrapper_function()
{
function();
}
int main()
{
test(); // OK
functions[0](); // OK
wrapper_function<test>(); // OK
wrapper_function<functions[0]>(); // Error?
}
MSVCรวบรวมรหัส แต่ Intellisense ให้ข้อผิดพลาดดังต่อไปนี้:invalid nontype template argument of type "const FunctionPointer"
gccไม่สามารถคอมไพล์ด้วยข้อความต่อไปนี้:
<source>: In function 'int main()':
<source>:19:33: error: no matching function for call to 'wrapper_function<functions[0]>()'
19 | wrapper_function<functions[0]>(); // Error?
| ^
<source>:8:13: note: candidate: 'template<void (* function)()> void wrapper_function()'
8 | static void wrapper_function()
| ^~~~~~~~~~~~~~~~
<source>:8:13: note: template argument deduction/substitution failed:
<source>:19:30: error: '(FunctionPointer)functions[0]' is not a valid template argument for type 'void (*)()'
19 | wrapper_function<functions[0]>(); // Error?
| ~~~~~~~~~~~^
<source>:19:30: note: it must be the address of a function with external linkage
เสียงดังกราวล้มเหลวในการรวบรวมกับข้อความต่อไปนี้:
<source>:19:2: error: no matching function for call to 'wrapper_function'
wrapper_function<functions[0]>(); // Error?
^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
<source>:8:13: note: candidate template ignored: invalid explicitly-specified argument for template parameter 'function'
static void wrapper_function()
^
1 error generated.
คำถาม:
คือwrapper_function<functions[0]>();
ถูกต้องหรือไม่?
หากไม่เป็นเช่นนั้นมีสิ่งใดบ้างที่ฉันสามารถทำเพื่อส่งผ่านfunctions[0]
อาร์กิวเมนต์แม่แบบไปได้wrapper_function
หรือไม่ { wrapper_function<functions[0]>, ..., wrapper_function<functions[std::size(functions) - 1]> }
เป้าหมายของฉันคือการสร้างอาร์เรย์ใหม่ของตัวชี้ฟังก์ชั่นที่รวบรวมเวลากับเนื้อหา
wrapper_function<decltype(functions[0])>()
ไม่ได้รวบรวม