函数模板规范
specification of function templates
本文关键字:函数模板 更新时间:2023-10-16
我想创建一个函数模板,其中类T仅限于特殊基类T_base的派生类。实现这一目标的有效方法是什么?谢谢你的帮助!
可以使用类型特征和SFINAE
template<typename T,
bool[std::is_base_of<T_base, T>::value] = nullptr>
void f(T const&);
c++ 03版本也适用于c++ 11
template<typename T>
typename boost::enable_if< boost::is_base_of<T_base, T> >::type
f(T const&);
c++ 11版本使用默认实参
将enable_if
移动到模板形参列表中template<typename T,
typename = typename std::enable_if<
std::is_base_of<T_base, T>::value>::type>
void f(T const&);
遗憾的是,如果你的其他重载的唯一区别是SFINAE字符串(即默认参数),那么你就不能重载f
,因为默认参数不是函数模板签名的一部分。但是模板参数本身的类型是(这些规则就像普通的函数参数)。
c++ 0x有std::enable_if
;如果你的编译器还不支持它,有boost::enable_if
。
例如,如果签名是template<typename T> int f(T&)
,您将使用
template<typename T>
std::enable_if<std::is_base_of<T_base, T>::value, int>::type f(T&);
我能想到的最简单的方法是:
template<class T>
void someFunc(T arg)
{
dynamic_cast<BaseClass>(arg); // will throw an exception if not castable to base class
// continue...
}
相关文章:
- 当函数模板参数是具有默认参数的类模板时,函数模板参数的推导如何执行
- 将重载的成员函数传递给函数模板
- 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 时意外的函数模板
- 两个函数模板候选项.将一个参数作为引用后,选择不太专业的模板