具有常量值的任何模板化类型的类型特征
Type trait for any templated types with constant values
我目前正在制作一个代码,该代码需要针对任何具有模板的类型进行特定的实现,因此我正在尝试编写适用于任何模板化类型的类型特征。
现在,我有这个:
template<class T>
struct TIsTemplated { enum { Value = 0 }; };
template<template<typename, typename...> class T, typename First, typename... Values>
struct TIsTemplated<T<First, Values...>> { enum { Value = 1 }; };
这适用于模板化类型,例如
template<typename T>
struct X { };
但是,一旦存在具有常量值的类型,它就会失败:
template<typename T, int i = 10>
struct Y {};
我发现我可以做一个这样的类型:
template<int A, template<typename, int> class T, typename First>
struct TIsTemplated<T<First,A>> { enum { Value = 1 }; };
但是,这只有在我预先知道我将有一个需要int
的类型时才有效。我试图概括这一点:
template<typename C>
template<C A, template<typename, C> class T, typename First>
struct TIsTemplated<T<First,A>> { enum { Value = 1 }; };
但即使这编译正确,TIsTemplated
对于类型 Y
仍然是错误的。有没有办法在不必知道常量类型的情况下实现这一点?
template<class...>struct types{using type=types;};
是类型的捆绑包。
template<class Scalar, class T>
struct is_template_with_scalar : std::false_type {};
template<class Scalar, template<class,Scalar>class Z, class U, Scalar s>
struct is_template_with_scalar<Scalar, Z<U,s>> : std::true_type {};
测试是否给定Scalar
类型,该类型是否T
与模式template<class, Scalar>
匹配。
然后我们把它卷曲一下:
template<class Scalar>
struct scalar_test {
template<class T>
using result=is_template_with_scalar<Scalar, T>;
};
这需要一堆布尔类型,并评估它们的逻辑或:
template<class...Ts>
struct or_types : std::false_type {};
template<class T0, class...Ts>
struct or_types<T0, Ts...> : std::integral_constant<bool, T0{} || or_types<Ts...>{} >
{};
passes_any
采用类型列表,以及采用类型的元测试。 它生成一个测试,说明是否有任何测试通过:
template<class List, template<class>class Test>
struct passes_any {};
template<class...Ts, template<class>class Test>
struct passes_any<types<Ts...>, Test> {
template<class U>
using result=or_types< typename Test<Ts>::template result<U>... >;
};
现在,我们从:
using scalars_supported = types<int, char, std::size_t, unsigned>; // etc
我们得到了一个测试:
template<class T>
using is_scalar_template =
typename passes_any<scalars_supported,scalar_test>::template result<T>;
给定类型T
是模板的实例,其模式<class, Scalar>
适用于scalars_supported
列表中的任何Scalar
,则该类型为真实类型。
现场示例
相关文章:
- 根据C++标准的定义实现"is_similar"类型特征
- C++类型特征,以查看是否可以<uint32_t>对类型"K"的任何变量调用"static_cast(k)"
- C ++类型特征:确保子类实现方法
- 根据类型特征更改函数定义?
- 如何使用类型特征将函数的通用引用参数限制为 r 值引用?
- 在C++中创建新的类型特征
- 如何构造一个类型特征,可以判断一个类型的私有方法是否可以在另一个类型的构造函数中调用?
- std::begin-类型特征中未考虑用户定义的重载
- 在类型特征修改后,无法限定类型
- 使用类型特征的部分类专用化
- 为什么不调用预期的函数?我是否对类型特征的理解不正确?
- 了解类型特征的体系结构
- 为什么使用某些类型特征的模板类型会导致模板扣除失败
- 有了C++类型特征,有没有办法避免铸造
- 哪种类型特征表明该类型是可分配的?(元组,对)
- 一种类型特征,标识哪个类提供通过重载解析选择的函数
- 如何使用类型特征正确推断引用的参数
- 如何通过扩展以下类型特征来删除 decltype(&MyClass::funct) 部分?
- 从标准库类型特征继承
- 为什么类型特征不适用于命名空间范围内的类型?