包括并从模板实例化中排除类型
Including and excluding types from template instantiation
我想从模板实例化中抑制某些类型。我想在库中实现一种仅适用于实数,而不适用于复杂或整数类型的算法。因此,使用float/double/long double/mpf_class的用户实例应该可以,但即 complex<float>
必须不发生。
专业会产生代码膨胀,而代码将永远不会使用。(我只能生成CTOR,只会投掷异常(。
template<typename T>
void work (T & result, T const & input) { /* work for any real type */ }
理想情况下,应该有一个编译器消息,上面写着"不允许这样的实例化"。
允许模板的明确列表太限制了。
您可以使用static_assert
生成所需的确切编译时错误消息:
#include <type_traits>
template<typename T>
void work (T & result, T const & input)
{
static_assert(std::is_floating_point<T>::value, "Only floating point types are allowed.");
// ...
}
如果您使用的是C 17,则可以短一点:
static_assert(std::is_floating_point_v<T>, "Only floating point types are allowed.");
,如果要防止特定类型的实例化,则可以将模板的特定专业定义为delete
D。
一个最小的示例,以防止用T=int
实例化:
template<typename T>
void work (T & result, T const & input) { (void)result; (void)input; }
template<>
void work (int & result, int const & input) = delete;
int main()
{
float f1 = 3.14;
float f2 = 1.414;
work(f1, f2); //works
int i1 = 1;
int i2 = 2;
work(i1, i2); //Doesn't work
}
编译器将投诉使用int
进行实例化。
error: use of deleted function 'void work(T&, const T&) [with T = int]'
16 | work(i1, i2); //Doesn't work
demo
出于完整的清晰度,还有sfinae。
template<typename T>
auto work (T & result, T const & input) -> std::enable_if_t<std::is_floating_point_v<T>>
{
// ..
}
省略了void
,因为它是默认类型enable_if_t
在条件下的情况下解决。这只是一种风格的选择。
这里的区别在于,该函数甚至不被认为存在于过载分辨率中。因此,您可以在其他SFINAE上下文中检查work
是否可以使用参数。将检查放入函数模板的签名是实现此目的的唯一方法。
相关文章:
- ArduinoJson 6.15.2:JsonObject没有命名类型
- 防止主数据类型C++的隐式转换
- 大量序列中核苷酸类型的快速计数
- 如何从C++中的依赖类型中获得它所依赖的类型
- 有关插入适配器的错误。[错误]请求从 'back_insert_iterator<vector<>>' 类型转换为非标量类型
- 是否可以初始化不可复制类型的成员变量(或基类)
- 如何获取std::result_of函数的返回类型
- 从父命名空间重载类型
- 如果C++类在类方法中具有动态分配,但没有构造函数/析构函数或任何非静态成员,那么它仍然是POD类型吗
- 我想将一个对T类型的非常量左值引用绑定到一个T类型的临时值
- Openssl 1.1.1d无效使用不完整的类型"struct dsa_st"
- 访问者访问变体并返回不同类型时出错
- 在VS2010-VS2015下编译时,如何使用decltype作为较大类型表达式的LHS
- 处理小于cpu数据总线的数据类型.(c++转换为机器代码)
- 对"无效的抽象返回类型"进行故障排除
- 包括并从模板实例化中排除类型
- 从类模板中排除转换运算符...<类型名 T>基于 T 上的特征
- 正在从类模板中排除类型
- 模板类C++-排除某些类型
- Visual Studio 2010-排除文件类型