如何解决比较模板本身而不是实例化的模板类型
我的目标是能够比较模板,即写这样的东西
template<typename T>
struct template_type;
template<template <typename...> typename TTmpl,typename ...Ts>
struct template_type<TTmpl<Ts...>> { using type = TTmpl; }; // [1] this isn't valid C++
template<typename TRng,typename T>
auto find(TRng&& rng,const T& val)
{
using TTmpl = typename mcu::template_type<std::remove_const_t<std::remove_reference_t<TRng>>>::type;
if constexpr (std::is_same_v<TTmpl,std::set>) // [2] this isn't valid C++
{
return rng.find(val);
}
else
{
using namespace std;
return std::find(begin(rng),end(rng),val);
}
}
我的第二次尝试是使用别名模板和自定义 same
函数。类似的东西:
template<typename T>
struct template_type;
template<template <typename...> typename TTmpl,typename ...Ts>
struct template_type<TTmpl<Ts...>> { template<typename ...Us> using type = TTmpl<Us...>; };
template<template<typename...>typename T1,template<typename...> typename T2>
struct same : std::false_type {};
template<template<typename...>typename T>
struct same<T,T> : std::true_type {};
但这也行不通。问题是 same<std::set,template_type<std::set<int>>::type>::value
返回 false,即模板类和它的模板别名由于某种原因不同。
我的第三次尝试是写一些类似 template_type_identity
的东西,但我不知道我应该使用什么作为身份:
template<template<typename...> typename T>
struct template_type_identity { using type = ???; }; // I Could hardcode some constexpr ids for each template but I wanna generic solution
解决方法
我不确定我是否理解您想要什么,也因为我会为您的激励案例使用不同的解决方案(在成员 find
的存在下的 sfinae)。无论如何,这就是检查给定类型是否是模板的实例化的方法,前提是模板只有类型参数:
#include <iostream>
#include <type_traits>
#include <set>
#include <vector>
template <template<typename...> typename T,typename C>
struct is_instantiation_of : std::false_type {};
template <template<typename...> typename T,typename ...P>
struct is_instantiation_of< T,T<P...>> : std::true_type {};
int main(){
std::cout << is_instantiation_of<std::set,std::set<int>>::value;
std::cout << is_instantiation_of<std::set,std::vector<int>>::value;
}
10
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。