在这个例子中,我创建了一个Functor类,它将函数作为参数。第二个仿函数应将第一个仿函数的对象作为模板参数,并调用第一个仿函数的函数。我不确定第二个Functor的模板必须如何。
这是第一个按预期工作的Functor:
typedef float (*pDistanceFu) (float, float);
typedef float (*pDecayFu) (float, float, float);
template <pDistanceFu Dist, pDecayFu Rad, pDecayFu LRate>
class DistFunction {
public:
DistFunction() {}
DistFunction(char *cstr) : name(cstr) {};
char *name;
float distance(float a, float b) { return Dist(a,b); };
float rad_decay(float a, float b, float c) { return Rad(a,b,c); };
float lrate_decay(float a, float b, float c) { return LRate(a,b,c); };
};
这里我创建了一个专门的仿函数实例:
DistFunction<foo,bar,foobar> fcn_gaussian((char*)"gaussian");
这里我不知道模板必须如何看待,采取任何类型的DistFunction&lt; ...&gt;作为参数
template<template<DistFunction> typename = F>
struct functor {
float fCycle;
float fCycles;
functor(float cycle, float cycles) : fCycle(cycle), fCycles(cycles) {}
float operator()(float lrate) {
return (F.lrate_decay)(lrate, fCycle, fCycles);
}
};
我想如何使用第二个仿函数:
typedef DistFunction<foo,bar,foobar> gaussian;
void test() {
functor<gaussian> test(0,1);
}
错误:
error: argument list for class template "DistFunction" is missing
error: expected "class"
error: expected a "," or ">"
答案 0 :(得分:2)
尝试
template<typename F>
struct functor {
float fCycle;
float fCycles;
functor(float cycle, float cycles) : fCycle(cycle), fCycles(cycles) {}
float operator()(float lrate) {
return F((char*)"gaussian").lrate_decay(lrate, fCycle, fCycles);
}
};
答案 1 :(得分:2)
template<DistFunction> typename = F
这是一个未命名的模板模板参数,其中包含一个类型为DistFunction
的非类型参数,默认值为F
。由于DistFunction
不是类型(它是类模板)并且F
不存在,因此没有意义。
此处不需要任何模板模板参数。简单
template<typename F>
struct functor {
应该做的。
如果你想限制 F
,也就是说,只允许它接受DistFunction
的各种实例化而不需要其他任何实例,你需要不同的语言设施,例如{ {1}}和/或static_assert
。只有在有人错误地解释enable_if
时才需要更好的错误消息。只需使用functor
,就好像它是F
一样。