从模板函数参数确定参数类型

Determine argument type from template function argument

本文关键字:参数 类型 函数      更新时间:2023-10-16

我习惯了c++模板,以及为可移植代码(MSVC, XCode…)编写代码。在简化的形式中,我写了一个函数

template <typename T, void (*FUNC)(T, T)>
void ApplyFuncOnBuffer(T* buffer, int count) { /* ... */ }

和调用者模板代码类似于

template <typename A>
void Process(A val1, A val2) { /* ... */ }
template <typename A>
void ProcessBuffer(A* buffer, int count)
{
    ApplyFuncOnBuffer<A, &Process>(buffer, count);
}

很好,它可以编译并工作,但是我想简化

的调用
ApplyFuncOnBuffer<A, &Process>(buffer, count);

ApplyFuncOnBuffer<&Process>(buffer, count);

这意味着找到一种方法从FUNC模板参数中确定T我搜索并尝试了解决方案,但"模板化"参数FUNC

template <template <typename T> void (*FUNC)(T, T)>
void ApplyFuncOnBuffer(T* buffer, int count) { /* ... */ }

MSVC编译器说:

error C2988: unrecognizable template declaration/definition
error C2059: syntax error : '<L_TEMPLATEDECL>'
error C2143: syntax error : missing ',' before '<end Parse>'
error C4430: missing type specifier - int assumed. Note: C++ does not support default-int

全局表示语法错误。

最后,我的问题是:有没有人知道一些有效的语法,允许从FUNC模板参数确定T类型,而不必将其显式添加为ApplyFuncOnBuffer的模板参数?

有人知道一些有效的语法,允许从FUNC模板参数确定T类型,而不必将其显式添加为ApplyFuncOnBuffer的模板参数吗?

没有这样的运气。正如科伦坡所指出的,有一个提议最终会让你做你想做的事。但在此之前,您实际上有三个选择:

  1. 坚持冗长:

    ApplyFuncOnBuffer<A, &Process>(buffer, count);
    
  2. 写一个宏(shudder)为你拉出A

    #define APPLY(func) get_arg_type_t<func>, func
    ApplyFuncOnBuffer<APPLY(&Process)>(buffer, count);
    
  3. 如果可能,将函数指针作为参数:

    template <typename T>
    void ApplyFuncOnBuffer(T*, void (*)(T, T), int );
    ApplyFuncOnBuffer(buffer, Process, count);
    

明智地选择你的武器