2016-10-20 60 views
2

什麼是在C++ 03的標準方法,在不使用升壓,要麼:如何爲另一個模板類型重載模板類方法?

  1. 重載其中模板類型僅出現在該方法的返回值的模板類方法,或
  2. 專營另一種模板類型的模板類方法。

換句話說,這怎麼能進行工作:

template <typename T, int N> struct Vector { T x[N]; }; 

struct Sampler 
{ 
    template <typename T> 
    T next() { 
     // Do some work and return a value of type T. 
     return T(); 
    } 

    template <typename T, int N> 
    Vector<T, N> next() { 
     // Do some different work and return a value of type Vector<T, N>. 
     return Vector<T, N>(); 
    } 
}; 

int main() { 
    Sampler sampler; 
    sampler.next<double>(); 
    sampler.next<Vector<float, 2> >(); 
    return 0; 
} 

書面,電話next()第一種方法,兩種用途,而我想第二次使用調用第二個方法。

+0

由於這兩種方法都會調用默認的c'tor,所以在提供的情況下不需要第二種方法。 – StoryTeller

+0

@StoryTeller返回值只是爲了編譯代碼,不關注它。 –

回答

3

看起來像是要求模板函數的部分專業化。這不在語言中,但您可以使用標籤分發或類模板來模擬它。下面是與標籤派遣一個例子:

template <typename T> struct tag{}; 
struct Sampler 
{  
    template <typename T> 
    T next() { 
     return next(tag<T>()); 
    } 

private: 
    template <typename T> 
    T next(tag<T>) { 
     return T(); 
    } 

    template <typename T, int N> 
    Vector<T, N> next(tag<Vector<T,N> >) { 
     return Vector<T, N>(); 
    } 
}; 

然後你使用這樣的:

sampler.next<double>(); 
sampler.next<Vector<double,2> >(); 

Live demo

請注意,您所需要的最後> >標記之間的空間中前C第二線++ 11。

+2

這實際上是我即將發佈的內容:) – StoryTeller

+1

謝謝,我懷疑標籤在這裏會有所幫助。我建議讓這個類的'tag'變爲私有的,並且在公共'next()'方法中刪除多餘的元素。 (他們是多餘的,對吧?) –

+0

@FrançoisBeaune是的,如果你不打算在其他任何地方使用這個習語,那麼使標籤變得私密是一個好主意,即使這樣它也可以避免污染。你是對的括號;我是過度熱心與我最棘手的解析迴避;) – TartanLlama

2

您可以使用輔助結構:

template<typename T> 
struct SamplerHelper 
{ 
    T operator()() const 
    { 
     std::cout << "T\n"; 
     return T(); 
    } 
}; 

template<typename T, int N> 
struct SamplerHelper<Vector<T, N> > 
{ 
    Vector<T, N> operator()() const 
    { 
     std::cout << "vec\n"; 
     return Vector<T, N>(); 
    } 
}; 

struct Sampler 
{ 
    template <typename T> 
    T next() { 
     return SamplerHelper<T>()(); 
    } 
}; 

一個working example is available on wandbox

+0

@TartanLlama謝謝,修正。 –

+0

這種方法唯一的缺點是它需要將課程分成三部分;在我的情況下這是不可能的,這就是爲什麼我接受另一個答案。但這是對我的問題的一個很好的,非常有效的答案,所以我提出了這個問題。 –

相關問題