c++ - 标准库是否有办法检查两个模板类型的基本模板类型是否相等?
问题描述
想出正确的术语来充分搜索它时遇到了麻烦,但是标准库是否有东西可以测试相同的基本模板类型?
template <typename T>
struct foo {};
template <typename T>
struct bar {};
static_assert(std::is_same_base_type<foo<int>, foo<float>>::value == 1);
static_assert(std::is_same_base_type<foo<int>, bar<int>>::value == 0);
解决方案
在标准库中?
不,据我所知。
但是写起来很琐碎。
template <typename, typename>
struct is_same_template : public std::false_type
{ };
template <template <typename> class C, typename T, typename U>
struct is_same_template<C<T>, C<U>> : public std::true_type
{ };
所以你可以写
static_assert( true == is_same_template<foo<int>, foo<float>>::value, "!" ) ;
static_assert( false == is_same_template<foo<int>, bar<int>>::value, "!" );
该解决方案的问题在于,专门化仅适用于仅接收一个模板类型参数的模板模板库。
您可以改进它,因为基础(模板模板参数)接收可变参数列表
template <template <typename...> class C,
typename ... Ts, typename ... Us>
struct is_same_template<C<Ts...>, C<Us...>> : public std::true_type
{ };
但这并不能通过示例来检查,std::array
static_assert( true == is_same_template<std::array<int, 3u>,
std::array<float, 5u>>::value, "!" ) ;
因为std::array
你必须添加另一个专业
template <template <typename, std::size_t> class C,
typename T1, std::size_t S1, typename T2, std::size_t S2>
struct is_same_template<C<T1, S1>, C<T2, S2>> : public std::true_type
{ };
不幸的是,有无数可能的模板-模板签名,所以你必须添加无数的特化is_same_template
。
这就是(我想)没有标准库类型特征的原因。
推荐阅读
- delphi - 当应用程序通过任务管理器终止时,ole 容器关闭功能会触发 EOleSysError
- python - 如何获得张量的值?Python
- java - 几帧后对象变量变为 NaN
- c# - 将项目移动到特定文件夹时附加事件侦听器 Outlook VSTO
- java - Spring Cloud Contract:多个控制器
- hadoop - AWS EMR - 如何扩展 hdfs 容量
- javascript - 如何递归修改解析的 JSON 对象中的嵌套属性
- javascript - javascript bigint 到字节数组
- vba - 根据列中的多个值格式化行
- java - 权限被拒绝通过 Hadoop java API 访问 HDFS