模板类作为模板类参数

时间:2016-05-03 09:18:41

标签: c++ templates

在这个例子中,我创建了一个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 ">"

2 个答案:

答案 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);
  }
};

LIVE

答案 1 :(得分:2)

template<DistFunction> typename = F

这是一个未命名的模板模板参数,其中包含一个类型为DistFunction的非类型参数,默认值为F。由于DistFunction不是类型(它是类模板)并且F不存在,因此没有意义。

此处不需要任何模板模板参数。简单

template<typename F>
struct functor {

应该做的。

如果你想限制 F,也就是说,只允许它接受DistFunction的各种实例化而不需要其他任何实例,你需要不同的语言设施,例如{ {1}}和/或static_assert。只有在有人错误地解释enable_if时才需要更好的错误消息。只需使用functor,就好像它是F一样。