Tôi muốn chuyển một con trỏ hàm từ một mảng các con trỏ hàm làm đối số mẫu. Mã của tôi dường như biên dịch bằng MSVC mặc dù Intellisense phàn nàn rằng có gì đó không đúng. Cả gcc và clang đều không biên dịch mã.
Hãy xem xét ví dụ sau:
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 biên dịch mã nhưng Intellisense đưa ra lỗi sau:invalid nontype template argument of type "const FunctionPointer"
gcc không thể biên dịch với thông báo sau:
<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
clang không biên dịch với thông báo sau:
<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.
Câu hỏi:
Có wrapper_function<functions[0]>();
hợp lệ hay không?
Nếu không, có điều gì tôi có thể làm để chuyển functions[0]
thành đối số mẫu wrapper_function
không? Mục tiêu của tôi là xây dựng một mảng mới các con trỏ hàm tại thời gian biên dịch, với nội dung { wrapper_function<functions[0]>, ..., wrapper_function<functions[std::size(functions) - 1]> }
.
wrapper_function<decltype(functions[0])>()
không biên dịch.