如何检查模板模板的界面 class
How to inspect the interface of a template template class
我试图根据模板模板参数是否定义了 type
类型(例如 std::remove_reference
有一个 type
成员类型别名),但我想不出这样做的好方法。
例如,我想做
template <template <typename...> class Trait>
using EnableIfHasTypeMember = std::void_t<Trait::type>;
template <template <typename...> class Trait, typename OtherStuff,
EnableIfHasTypeMember<Trait>* = nullptr>
class Something { ... }
但这给了我一个编译器错误。有什么方法可以检查模板模板参数的接口吗?
如果我正确理解了您的需求,那么您在示例中展示的一般性水平是不可能的。除非您知道模板实例化时使用的参数,否则您无法知道模板是否具有类型成员类型别名,因为它可能因专业化而异。示例:
template <typename T>
struct my_trait
{
using type = int;
};
template <>
struct my_trait<double> {};
您认为 EnableIfHasTypeMember
在这种情况下会如何表现?这就是为什么在实例化之前无法推断模板的内容。
在这种情况下,记住 my_trait<T>
不同类型 T
的所有实例都是彼此不同的类型 会有所帮助。类型之间没有实际关系;它们起源于一个通用模板,该模板允许编写可重用的通用实现,但具体类型一旦实例化就完全独立了。
@Jason R 是正确的,您不能在 class 模板级别执行此操作。
如果您想要检测具有 type
成员的 class 模板,您必须提供参数以获取特定类型,以检查成员。
正在适应an example
// primary template handles types that have no nested ::type member:
template< class, class = std::void_t<> >
struct has_type_member : std::false_type { };
// specialization recognizes types that do have a nested ::type member:
template< class T >
struct has_type_member<T, std::void_t<typename T::type>> : std::true_type { };
// specialization recognizes class templates that do have a nested ::type member:
template< template< class ... > class T, class ... Args >
struct has_type_member<T<Args...>, std::void_t<typename T<Args...>::type>> : std::true_type { };
我试图根据模板模板参数是否定义了 type
类型(例如 std::remove_reference
有一个 type
成员类型别名),但我想不出这样做的好方法。
例如,我想做
template <template <typename...> class Trait>
using EnableIfHasTypeMember = std::void_t<Trait::type>;
template <template <typename...> class Trait, typename OtherStuff,
EnableIfHasTypeMember<Trait>* = nullptr>
class Something { ... }
但这给了我一个编译器错误。有什么方法可以检查模板模板参数的接口吗?
如果我正确理解了您的需求,那么您在示例中展示的一般性水平是不可能的。除非您知道模板实例化时使用的参数,否则您无法知道模板是否具有类型成员类型别名,因为它可能因专业化而异。示例:
template <typename T>
struct my_trait
{
using type = int;
};
template <>
struct my_trait<double> {};
您认为 EnableIfHasTypeMember
在这种情况下会如何表现?这就是为什么在实例化之前无法推断模板的内容。
在这种情况下,记住 my_trait<T>
不同类型 T
的所有实例都是彼此不同的类型 会有所帮助。类型之间没有实际关系;它们起源于一个通用模板,该模板允许编写可重用的通用实现,但具体类型一旦实例化就完全独立了。
@Jason R 是正确的,您不能在 class 模板级别执行此操作。
如果您想要检测具有 type
成员的 class 模板,您必须提供参数以获取特定类型,以检查成员。
正在适应an example
// primary template handles types that have no nested ::type member:
template< class, class = std::void_t<> >
struct has_type_member : std::false_type { };
// specialization recognizes types that do have a nested ::type member:
template< class T >
struct has_type_member<T, std::void_t<typename T::type>> : std::true_type { };
// specialization recognizes class templates that do have a nested ::type member:
template< template< class ... > class T, class ... Args >
struct has_type_member<T<Args...>, std::void_t<typename T<Args...>::type>> : std::true_type { };