我想知道是否有任何解决方案来查找类型是否是模板的特殊化,该模板采用非类型参数而不指定每个类型?
例如,如果有这样的类:
template<typename T, std::size_t R>
struct F {}
目前,我使用的是非常专业的特征:
template<template<typename, std::size_t> class TT, typename T>
struct is_2 : std::false_type { };
template<template<typename, std::size_t> class TT, typename V1, std::size_t R>
struct is_2<TT, TT<V1, R>> : std::true_type { };
和一样使用is_2<F, T>::value
。但是,这是不切实际的,因为如果添加另一个模板参数,则必须编辑特征。此外,如果您有多个此类模板,则需要为每个模板编写一个特征。
有什么办法可以使事情变得更实用?我可以使用C ++ 14。我的意思不是使用宏来减少代码量。
非类型模板参数有点像一个红色的继子。
没有“是否匹配任何模板参数,请输入或不输入”。
如果可以修改F
,则可以通过将常量包装为细型来使其更加统一。所以:
template<typename T, class R>
struct F;
template<typename T, std::size_t R>
struct F<T, std::integral_constant<std::size_t, R>> {};
现在像元程序这样is
可以统一编写:
template<template<class...>class Template, class T>
struct is_instantiation : std::false_type {};
template<template<class...>class Template, class... Ts>
struct is_instantiation<Template, Template<Ts...>> : std::true_type {};
匹配所有内容。
如果您对的控制较少F
,则可以使用您的方法,也可以编写使用类型包装器将atemplate
和其实例提升到一个实例的元程序template
。
struct meta_F {
template<class T, std::size_t R>using raw_apply=F<T,R>;
template<class T, class R>using apply=raw_apply<T,R::value_type>;
};
template<class meta_Template, class... Args>
struct type_lifted_template {};
template<class T, std::size_t R>
struct type_lifted_template< meta_F, T, std::integral_constant<std::size_t, R> > {
using result = meta_F::template raw_apply<T, R>;
};
template<class T, std::size_t R>
auto type_lift_instance( F<T,R> )
-> type_lifted_template< meta_F, T, std::integral_constant<std::size_t, R> >;
现在,type_lift_instance
可以专门用于多种类型,并且decltype
可以使用一些魔术来提取type_lifted_template
不同类型的专门化。
所有这些都是很粗糙的。如果您要在模板上进行大量元编程,那最好是让模板采用统一的类型参数,而不用弄乱这些东西。
template<class meta_F, class C>
struct meta_template_is_lifted : std::false_type {};
template<class meta_F, class...Ts>
struct meta_template_is_lifted<meta_F, type_lifted_template< meta_F, Ts... >> : std::true_type {};
template<class meta_F, class C>
struct meta_template_is : meta_template_is_lifted< meta_F, decltype(type_lift_instance( std::declval<C>() ) ) > {};
这并不是很多类型,但是元化与is
代码(或其他类似代码)的距离很远。
我可能错误地使用了“提升”。
本文收集自互联网,转载请注明来源。
如有侵权,请联系 [email protected] 删除。
我来说两句