C++模板基类的非类型函数模板的 using 声明

C++ using-declaration for non-type function templates of template base class

本文关键字:函数模板 using 声明 类型 基类 C++      更新时间:2023-10-16

在阅读了有关SO的几个答案(例如这里和这里(之后,我想出了在模板库中调用函数模板的两种常用方法:

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>(); }    
};

演示

但是,对于非模板函数,是否也存在与using Base<T>::foo声明等效的声明?也许像

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

作为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>(); }

根据我在阅读T.C.的评论后的理解,这是VS2015的自定义扩展,该行为不是标准的一部分,甚至可能被认为是格式不正确的。

<小时 />

我也无法让它与您的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; 
}