在SO上阅读了几个答案(例如here和here),我想出了在模板库中调用函数模板的两种常用方法:
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
答案 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;
}