静态成员定义中的双'template'关键字 我最近没有使用最新的C++标准,今天我想在C++中实现Haskell风格列表,并提出如下的一些东西: template<typename T> class List { private: std::function<std::tuple<T,List<T>>()> f; List() {} List(T h, List<T> t) :f([h, t]() { return std::make_tuple(h, t); }) {} public: typedef T item_type; static List<T> empty(); static List<T> cons(T h, List<T> t); template<typename N, typename C> static auto on(N n, C c) -> decltype(N()); }; template<typename T> List<T> List<T>::empty() { return List(); } template<typename T> List<T> List<T>::cons(T h, List<T> t) { return List([h, t](std::function<void(T, List<T>)> c) {f(c); }); } template<typename T> template<typename N, typename C> auto List<T>::on(N n, C c) -> decltype(N()) { if (f == nullptr) return n(); else { T h; List<T> t; std::tie(h, t) = f(); return c(h, t); } } template<typename T, typename R, typename F> R foldr(List<T> l, F f, R b) { return l.on([b]() { return b; }, [f, b](T h, List<T> t) { return foldr(t, f, f(t, b)); }); } 模板 班级名单{ 私人: std::函数f; 列表(){} List(th,List T):f([h,T](){return std::make_tuple(h,T);}){ 公众: 类型定义T项_类型; 静态列表为空(); 静态列表cons(th,List T); 模板 静态自动开启(N,C)->decltype(N()); }; 模板 List::empty(){ 返回列表(); } 模板 列表::cons(th,List T){ 返回列表([h,t](std::函数c){f(c);}); } 模板 模板 自动列表::on(N,C)->decltype(N()){ if(f==nullptr)返回n(); 否则{ th; 列表t; std::tie(h,t)=f(); 返回c(h,t); } } 模板 R文件夹(列表l、F、R b){ 返回l.on([b](){return b;}[f,b](th,List T){return foldr(T,f,f(T,b));}); }

静态成员定义中的双'template'关键字 我最近没有使用最新的C++标准,今天我想在C++中实现Haskell风格列表,并提出如下的一些东西: template<typename T> class List { private: std::function<std::tuple<T,List<T>>()> f; List() {} List(T h, List<T> t) :f([h, t]() { return std::make_tuple(h, t); }) {} public: typedef T item_type; static List<T> empty(); static List<T> cons(T h, List<T> t); template<typename N, typename C> static auto on(N n, C c) -> decltype(N()); }; template<typename T> List<T> List<T>::empty() { return List(); } template<typename T> List<T> List<T>::cons(T h, List<T> t) { return List([h, t](std::function<void(T, List<T>)> c) {f(c); }); } template<typename T> template<typename N, typename C> auto List<T>::on(N n, C c) -> decltype(N()) { if (f == nullptr) return n(); else { T h; List<T> t; std::tie(h, t) = f(); return c(h, t); } } template<typename T, typename R, typename F> R foldr(List<T> l, F f, R b) { return l.on([b]() { return b; }, [f, b](T h, List<T> t) { return foldr(t, f, f(t, b)); }); } 模板 班级名单{ 私人: std::函数f; 列表(){} List(th,List T):f([h,T](){return std::make_tuple(h,T);}){ 公众: 类型定义T项_类型; 静态列表为空(); 静态列表cons(th,List T); 模板 静态自动开启(N,C)->decltype(N()); }; 模板 List::empty(){ 返回列表(); } 模板 列表::cons(th,List T){ 返回列表([h,t](std::函数c){f(c);}); } 模板 模板 自动列表::on(N,C)->decltype(N()){ if(f==nullptr)返回n(); 否则{ th; 列表t; std::tie(h,t)=f(); 返回c(h,t); } } 模板 R文件夹(列表l、F、R b){ 返回l.on([b](){return b;}[f,b](th,List T){return foldr(T,f,f(T,b));}); },c++,c++11,templates,static-methods,C++,C++11,Templates,Static Methods,代码可以编译(VC 2015,尚未测试),但这让我花了一段时间为上的函数找出正确的语法。这是我第一次在C++中看到类似的东西,并且双模板< /Cord>关键字看起来很奇怪。 问题 当我们声明使用模板变量的静态泛型方法不能通过类模板使用时,这是正常的方法吗?有人能给我指出标准中的一些条款吗 当我们声明静态泛型方法 是否使用无法通过类模板使用的模板变量 是的,这很正常 有人能给我指出标准中的一些条款吗 从n4296、14.5.2成员模板中: 模板可以在类或类模板中声明;这样的 模板称为成员模板。可以

代码可以编译(VC 2015,尚未测试),但这让我花了一段时间为上的函数
找出正确的语法。这是我第一次在C++中看到类似的东西,并且双<代码>模板< /Cord>关键字看起来很奇怪。
问题

当我们声明使用模板变量的静态泛型方法不能通过类模板使用时,这是正常的方法吗?有人能给我指出标准中的一些条款吗

当我们声明静态泛型方法 是否使用无法通过类模板使用的模板变量

是的,这很正常

有人能给我指出标准中的一些条款吗

从n4296、14.5.2成员模板中:

模板可以在类或类模板中声明;这样的 模板称为成员模板。可以定义成员模板 在其类定义或类模板定义的内部或外部。A. 在其外部定义的类模板的成员模板 类模板定义应与 类模板的模板参数,后跟 成员模板的模板参数。[示例:

template<class T> struct string {
    template<class T2> int compare(const T2&);
    template<class T2> string(const string<T2>& s) { / ... / }
};

template<class T> template<class T2> int string<T>::compare(const T2& s) {
}
模板结构字符串{
模板int比较(常数T2&);
模板字符串(常量字符串&s){/../}
};
模板int字符串::比较(常量T2&s){
}
-[结束示例]


这是定义模板类的任何成员函数的常规方法,其中成员函数本身就是模板。对于这样一个小函数,它可以在类中内联定义,并且看起来更“正常”