【问题标题】:Detect if two types are a specialization of a same class template?检测两种类型是否是同一个类模板的特化?
【发布时间】:2013-04-21 01:20:39
【问题描述】:

我想知道如何编写一个type_traits 类来检测两种类型是否是同一个模板类的特化。最大的问题是它应该适用于混合类型/非类型模板类,例如:

template <typename T, std::size_t N>
class MyClass {};

有可能设计出这样的东西吗?

【问题讨论】:

  • @rhalbersma,不是重复的,另一个问题想知道如何判断两个专业化是否使用相同的定义,即都使用主模板,或者都使用相同的部分专业化,或者两者都使用使用相同的显式特化。据我所知,这不是这里的问题。
  • @Vincent,该特征是否需要用于检测 any 类模板的使用,还是仅用于MyClass?我认为一般来说类模板不可能同时使用类型和非类型参数。
  • @JonathanWakely 删除了评论,似乎无法撤回近距离投票。
  • @JonathanWakely:不,它应该适用于任何类型/非类型模板参数的组合,这就是整个问题......
  • 基本上,您想做元元编程——在元程序的域上编写程序 (templates)。 C++ 元元编程工具是有限的。使用 C++17 中可能出现的 template&lt; using typename T, 语法,您可能会更接近,但现在您可以遵循 C++03 用来模拟 template&lt;typename...T, 的“变量仿真”模式,除了额外的参数的指数或超指数膨胀(每个参数的每个整数类型、函数指针类型 (!) 和模板类型 (!!))。 enums 在 C++17 之前可能是无望的。

标签: c++11 template-specialization template-meta-programming typetraits


【解决方案1】:

我认为您通常不能对混合了类型参数和非类型参数的任意类模板执行此操作。

您可以接近更具体的参数集,但我不知道如何处理一般情况:

#include <type_traits>

template <typename T, std::size_t N>
class MyClass {};

// assume not the same
template<typename T, typename U>
struct my_trait : std::false_type
{ };

// both specializations of MyClass
template<typename T1, std::size_t N1, typename T2, std::size_t N2>
struct my_trait<MyClass<T1, N1>, MyClass<T2, N2>>
: std::true_type
{ };

// both specializations of some class template Templ<typename, std::size_t>
template<template<typename, std::size_t> class Templ, typename A1, std::size_t S1, typename A2, std::size_t S2>
struct my_trait<Templ<A1, S1>, Templ<A2, S2>>
: std::true_type
{ };

// both specializations of some class template Templ<typename...>
template<template<typename...> class Templ, typename... A1, typename... A2>
struct my_trait<Templ<A1...>, Templ<A2...>>
: std::true_type
{ };

【讨论】:

  • 如果您已经知道标量/非标量模式,decltype on template&lt;typename T, template&lt;T&gt;class U&gt; T get_scalar( U&lt;T&gt; ); 将让您找到标量类型。但是,我们没有“我将采用 templates、任何标量或 typenames”通配符模板参数。
  • C++17 稍微简化了这一点,因为您可以声明模板参数auto。现在的问题是“只是”类型与值与模板模板参数。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2016-01-24
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-08-07
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多