C ++ using-declaration用于模板基类的非类型函数模板

时间:2016-02-04 09:51:50

标签: c++ templates inheritance

在SO上阅读了几个答案(例如herehere),我想出了在模板库中调用函数模板的两种常用方法:

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 个答案:

答案 0 :(得分: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.后,这是VS2015的自定义扩展,行为不是标准的一部分,甚至可能被视为格式错误的

答案 1 :(得分: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; 
}