我习惯使用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的模板参数?
答案 0 :(得分:0)
任何人都知道一些有效的语法,允许从
T
模板参数中确定FUNC
类型,而不必将其显式添加为ApplyFuncOnBuffer
的模板参数?
没有这样的运气。正如Columbo指出的那样,有一项提案最终会让您按照自己的意愿行事。但在那之前,你有三个选择:
坚持冗长:
ApplyFuncOnBuffer<A, &Process>(buffer, count);
写一个宏(颤抖)为你拉出A
。
#define APPLY(func) get_arg_type_t<func>, func
ApplyFuncOnBuffer<APPLY(&Process)>(buffer, count);
如果可能,请将函数指针作为参数:
template <typename T>
void ApplyFuncOnBuffer(T*, void (*)(T, T), int );
ApplyFuncOnBuffer(buffer, Process, count);
明智地选择你的武器。