我一直在尝试使用Curiously Recurring Template Pattern用于通用单参数仿函数,并有两种实现:一种使用有效的模板模板参数,另一种我尝试在接口类中访问派生的 Functor::type。在后一个示例中,编译器 (gcc 5.4.0) 报告
错误: “struct Cube< double >”中没有名为“ type ”的类型
template<class T, template<class> class Functor>
class FunctorInterface_1 {
private:
const Functor<T> &f_cref;
public:
FunctorInterface_1() : f_cref(static_cast<const Functor<T>&>(*this)) {}
T operator() ( T val ) const { return f_cref(val); }
}; // FunctorInterface_1 (works)
template<class Functor>
class FunctorInterface_2 {
private:
const Functor &f_cref;
public:
using Ftype = typename Functor::type;
FunctorInterface_2() : f_cref(static_cast<const Functor&>(*this)) {}
Ftype operator() ( Ftype val ) const { return f_cref(val); }
}; // FunctorInterface_2 (no type in Functor!)
然后我尝试在以下两个类的 main() 中使用 T=double 进行编译:
template<class T>
struct Square : public FunctorInterface_1<T,Square> {
T operator()( T val ) const { return val*val; }
}; // Square
template<class T>
struct Cube : public FunctorInterface_2<Cube<T>> {
using type = T;
T operator() ( T val ) const { return val*val*val; }
}; // Cube
是否可以修改 FunctorInterface_2/Cube 示例以使其工作,或者是否需要像第一个示例中那样在 T 上对接口类进行模板化?谢谢!
编辑:使用 gcc -std=c++14,我可以通过在 FunctorInterface_1::operator() 中使用自动返回和参数类型来编译和运行第二个示例,但是,据我所知,自动参数类型不是C++14 标准。
编辑2:嗯,我觉得有点厚。我刚刚意识到我可以在一个新参数上模板 FunctorInterface_1::operator(),但是,对于我想到的应用程序,我真的希望我的基类能够访问派生类中定义的类型。