从模板函数参数

时间:2015-07-30 12:39:59

标签: c++ templates function-pointers typename

我习惯使用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的方法 我搜索并尝试了解决方案,但&#34; templatizing&#34;参数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的模板参数?

1 个答案:

答案 0 :(得分:0)

  

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

没有这样的运气。正如Columbo指出的那样,有一项提案最终会让您按照自己的意愿行事。但在那之前,你有三个选择:

  1. 坚持冗长:

    ApplyFuncOnBuffer<A, &Process>(buffer, count);
    
  2. 写一个宏(颤抖)为你拉出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);
    
  4. 明智地选择你的武器。