2016-02-04 124 views
4

的非類型的函數模板已經在SO讀幾個答案(如herehere),我想通了,有兩種常用的替代品在模板庫調用函數模板:C++使用聲明模板基類

template<typename T> 
struct Base 
{ 
    template<int N> 
    auto get() const 
    { 
     return N; 
    } 
}; 

template<typename T> 
struct Derived : public Base<T> 
{ 
    //first alternative 
    auto f0() const { return this-> template get<0>(); } 

    //second alternative 
    auto f1() const { return Base<T>::template get<1>(); }  
}; 

DEMO

但有也是一個相當於using Base<T>::foo聲明非模板的功能呢?也許類似

template<int N> 
using Base<T>::template get<N>; //does not compile in gcc 
+2

參見[CWG 109](http://wg21.link/cwg109) –

+0

@ T.C。所以這不是標準的一部分,我的部分(!)答案只顯示了VS2015提供的擴展? –

回答

1

我無法讓它與您的using一起工作。但是,如果意圖是簡化繁瑣的調用語法,那麼您可能會發現以下替代方法很有用。我認爲它也有類似的效果。

template<typename T> 
struct Base 
{ 
    template<int N> 
    auto get() const 
    { 
     return N;  
    } 
}; 

template<typename T> 
struct Derived : public Base<T> 
{ 
    auto f0() const 
    { 
     auto get_0 = Base<T>::template get<0>; 

     get_0(); 
    }  

    //second alternative 
    auto f1() const 
    { 
     auto get_1 = Base<T>::template get<1>; 

     get_1(); 
    }  
}; 

int main() 
{ 
    return 0; 
} 
+0

感謝您的努力,這很清楚。你也可以定義'template auto get()const {return this-> template得到(); }在類範圍內(可能相當於get的非const版本)。這個問題明確地是關於使用模板的聲明。 – davidhigh

2

至於using替代你可能會重新聲明函數的東西,如:

template<int N> auto get() const{ return Base<T>::template get<N>(); } 

該代碼可以使用VS2015,但不與coliru:

using Base<T>::template get; 
template<int N> 
auto f3() { return get<N>(); } 

從我的理解是在閱讀commenty by T.C.後,這是VS20的自定義擴展15並且行爲不屬於標準的一部分,甚至可能被視爲不合格