雙`

2017-01-17 19 views
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關鍵字對我來說看起來很奇怪。

問題

這是正常的方式,當我們宣佈,通過類模板使用模板變量不可用靜態泛型方法?任何人都可以指出我標準中的一些條款嗎?

+2

這是定義*模板類,其中所述成員函數本身是一個模板的任何*成員函數的正常方式。對於這樣一個小功能,它可以在課堂上內聯定義,並且看起來更「正常」。 –

+1

看到這個(http://stackoverflow.com/questions/7659322/how-to-define-template-function-within-template-class-in-inl [如何* .INL文件模板類中定義模板功能] -文件) – Rakete1111

回答

3

當我們聲明 使用模板變量不能通過類模板的靜態泛型方法時,這是正常的方式嗎?

是的,這是正常的。

任何人都可以點我在本標準中部分條款?

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

末端示例]