함수 포인터 배열에서 함수 인수를 템플릿 인수로 전달하고 싶습니다. Intellisense에서 무언가 잘못되었다고 불평하지만 내 코드는 MSVC를 사용하여 컴파일하는 것 같습니다. 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
clang 이 다음 메시지와 함께 컴파일에 실패합니다 :
<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
있습니까? 내 목표는 컴파일 타임에 content와 함께 새로운 함수 포인터 배열을 만드는 것입니다 { wrapper_function<functions[0]>, ..., wrapper_function<functions[std::size(functions) - 1]> }
.
wrapper_function<decltype(functions[0])>()
컴파일 조차 하지 않습니다.