如何测试类型是否为带有非类型参数的模板的特殊化?

巴蒂斯特·威希特

我想知道是否有任何解决方案来查找类型是否是模板的特殊化,该模板采用非类型参数而不指定每个类型?

例如,如果有这样的类:

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。我的意思不是使用宏来减少代码量。

Yakk-亚当·内夫罗蒙特

非类型模板参数有点像一个红色的继子。

没有“是否匹配任何模板参数,请输入或不输入”。

如果可以修改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] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章

为模板传递非类型参数参数

如何部分专门化类模板非类型参数

通过具有任何特殊化类型的另一个模板来约束模板参数

从模板化非类型模板参数推导模板参数

非类型模板参数如何编译?

是否可以保证对非类型模板参数的专业化具有唯一的不同成员指针的参数?

测试两个模板是否相同,即使使用非类型参数包作为参数

具有模板非类型模板参数的功能模板

如何使用非类型模板参数和类型模板参数的混合来对函数进行模板化?

没有constexpr的模板非类型参数的类型转换

具有不同类型的模板非类型参数

非类型模板参数不能具有类型

模板非类型参数推导

非类型模板参数

“使用类模板需要模板参数”错误,并带有默认指定的非类型模板参数值

带有继承的重载成员函数的指针的非类型模板参数

scala 中是否存在非类型模板参数?

从非类型模板参数确定类型

推断非类型模板参数的类型

C++ - 在具有非类型模板参数的模板化类上专门化函数模板

具有非类型参数的部分模板专业化:GCC与MSVS

具有非类型参数包的模糊类模板实例化

具有任何非类型参数的C ++模板专业化

C ++ 17可以推导出带有显式非类型参数的“ auto”非类型“ template”参数模式匹配模板吗?

初始化C ++ 2a类非类型模板参数时是否可以省略类型名称?

具有混合类型参数和非类型可变参数的模板模板参数

C ++模板模板非类型参数

模板非类型模板参数

未命名的非类型模板参数有什么意义?