我目前正在编写的代码需要对任何具有模板的类型进行特定实现,因此我正在尝试编写适用于任何模板化类型的类型特征。
现在,我得到了这个:
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>
的模板实例,则它是真实类型对于任何 Scalar
在scalars_supported
列表。
关于c++ - 具有常量值的任何模板化类型的类型特征,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37077616/