c++ - 具有常量值的任何模板化类型的类型特征

标签 c++ templates c++11 typetraits

我目前正在编写的代码需要对任何具有模板的类型进行特定实现,因此我正在尝试编写适用于任何模板化类型的类型特征。

现在,我得到了这个:

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 仍然是 false。有没有什么方法可以在不知道常量类型的情况下实现这一点?

最佳答案

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> .

然后我们稍微 curry 一下:

template<class Scalar>
struct scalar_test {
  template<class T>
  using result=is_template_with_scalar<Scalar, T>;
};

这需要一堆 bool 类型,并评估它们的逻辑或:

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> 的模板实例,则它是真实类型对于任何 Scalarscalars_supported列表。

live example

关于c++ - 具有常量值的任何模板化类型的类型特征,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37077616/

相关文章:

c++ - std::hash_set 中定义的 stdext::hash_value() 的性能

c++ - 为什么传递非静态成员函数会导致编译错误?

c++ - 我什么时候不需要 typedef?

python - 如何将 STATIC 目录中的文件包含到 Django 模板继承中

c++ - 将 MSVS 2010 项目转换为 MSVS 2012 RC 但出现错误 "The C++ standard doesn' t 为此类型提供哈希”

c++ - operator[] for std::map 什么情况下可以返回0?

c++ - 如果我在 C++ 中以 new 的放置形式使用的内存不足会怎样?

c++ - 编写一个读取五个整数并执行一些任务的 C++ 程序

c++ - 模板化优先级队列继承自模板化堆

c++ - 如何区分/分隔模板功能的两个连续可变参数模板参数包?