gpt4 book ai didi

c++ - 静态成员定义中的双 `template` 关键字

转载 作者:太空狗 更新时间:2023-10-29 21:14:08 26 4
gpt4 key购买 nike

我有一段时间没有使用最新的 C++ 标准,今天我想在 C++ 中实现一个 Haskell 风格的 List 并提出如下内容:

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

代码编译(VC 2015,尚未测试),但让我花了一些时间来找出函数 on 的正确语法。这是我第一次在 C++ 中看到这样的东西,双 template 关键字对我来说看起来很奇怪。

问题

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

最佳答案

Is this the normal way when we declare static generic methods that uses template variable not available through the class template?

是的,这很正常。

Can anyone point me out some clauses in the standard?

来自 n4296,14.5.2 成员模板:

A template can be declared within a class or class template; such a template is called a member template. A member template can be defined within or outside its class definition or class template definition. A member template of a class template that is defined outside of its class template definition shall be specified with the template-parameters of the class template followed by the template-parameters of the member template. [ Example:

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) {
}

—end example ]

关于c++ - 静态成员定义中的双 `template` 关键字,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41695963/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com