C++模板基类的非类型函数模板的 using 声明
C++ using-declaration for non-type function templates of template base class
在阅读了有关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;
}
相关文章:
- 当函数模板参数是具有默认参数的类模板时,函数模板参数的推导如何执行
- 将重载的成员函数传递给函数模板
- C++17中函数模板中的静态数组初始化(MSVC 2019)
- 为什么 gcc 和 clang 为函数模板的实例化生成不同的符号名称?
- 具有常量引用参数的函数模板专用化
- std::span<const T> 作为函数模板中的参数
- 如何编写一个完美的缩写函数模板?
- 仅在函数模板中为那些定义了函数的类型执行函数
- 如何在C++中伪造虚拟可变参数函数模板?
- 以下代码中的函数模板有什么问题?
- 在 C++20 中是否不再允许在 std 中对程序定义类型的函数模板进行专用化?
- 将显式实例化的函数模板与转换匹配
- 使用定义函数模板别名
- 函数模板返回类型
- C++有什么方法可以在既不调用函数模板也不提供其模板参数的情况下引用函数模板?
- C++ std::functional 中的可变参数函数模板
- 单行函数模板 c++ 的内联性保证
- C++函数模板需要 &for 数组参数
- 概念解析为使用 std::make_signed_t 时意外的函数模板
- C++模板基类的非类型函数模板的 using 声明