3
我沒有使用最新的C++標準了,而在靜態成員定義template`關鍵字,今天我想實現一個Haskell風格List
在C++中,拿出類似如下:雙`
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
關鍵字對我來說看起來很奇怪。
問題
這是正常的方式,當我們宣佈,通過類模板使用模板變量不可用靜態泛型方法?任何人都可以指出我標準中的一些條款嗎?
這是定義*模板類,其中所述成員函數本身是一個模板的任何*成員函數的正常方式。對於這樣一個小功能,它可以在課堂上內聯定義,並且看起來更「正常」。 –
看到這個(http://stackoverflow.com/questions/7659322/how-to-define-template-function-within-template-class-in-inl [如何* .INL文件模板類中定義模板功能] -文件) – Rakete1111