【问题标题】:Check if class is a template specialization? [duplicate]检查类是否是模板专业化? [复制]
【发布时间】:2015-10-24 02:58:14
【问题描述】:

如何检查给定类型是否是特定类模板的特化?例如,给定

template <class T>
struct A {};

我如何检查CompareT 是否是A&lt;*&gt; 对于以下某些类型的*

template<class CompareT>
void compare(){
   // is this A ?
   cout << is_same< A<*> , CompareT >::value;     // A<*> ????
}

int main(){
  compare< A<int> >();
}

例如,这里A&lt;int&gt; 应该匹配A&lt;*&gt; 并打印1。

【问题讨论】:

  • @quantdev 是的,但我需要适用于这种情况的 is_same :)
  • "这是 A 吗?" what 是 A 吗?你在比较什么?
  • 也许你的意思是:类型CompareT 是类型模板A 的实例吗?是否有一些X(任何X)的A&lt;X&gt;CompareT
  • @AaronMcDaid(和 tower120)实例化模板意味着通过插入每个模板参数的参数来生成最终类型(specialization)。类型的实现是通过模式匹配它的“签名”来选择的,选择的可以是 explicit (如std::vector&lt;bool&gt;)或 implicit (从第一个和最一般的声明)专业化。我们进一步区分 partialfull 显式特化,这取决于是否还有模板参数。

标签: c++ templates


【解决方案1】:

您可以在此处提供要匹配的模板:

template <class T, template <class...> class Template>
struct is_specialization : std::false_type {};

template <template <class...> class Template, class... Args>
struct is_specialization<Template<Args...>, Template> : std::true_type {};

static_assert(is_specialization<std::vector<int>, std::vector>{}, "");
static_assert(!is_specialization<std::vector<int>, std::list>{}, "");

【讨论】:

  • 请注意,这不适用于所有模板,例如问题中提到的std::array,该问题已作为副本关闭。
  • @Potatoswatter 确实如此。非类型模板参数仍然非常不灵活。
  • c++ 17 中的“自动”模板参数是否有任何解决方法?我正在尝试没有成功,但我仍然不是 c++ 模板的大师......
  • @NicoBerrogorry 有点。 auto可以用来推导非类型模板参数的类型,所以std::array可以匹配template &lt;template &lt;class, auto&gt; class Template, class T, auto S&gt; struct is_specialization&lt;Template&lt;T, S&gt;&gt;。但是,类型和非类型参数仍然不兼容,您需要生成大量这些排列来涵盖所有(合理的)情况。
  • name is_specialization 具有误导性,因为专业化意味着特定类型的模板的替代实现。 IMO 最好使用is_instance_ofis_template_of
【解决方案2】:

CompareT 是一个类型,A 是一个模板。同样,一个类不能成为模板。类可以是模板的特化,所以我假设这就是你想要的。

部分特化可以进行模式匹配:

template<class T>
struct is_an_A // Default case, no pattern match
    : std::false_type {};

template<class T>
struct is_an_A< A< T > > // For types matching the pattern A<T>
    : std::true_type {};

template< class CompareT >
void compare() {
    std::cout << is_an_A< CompareT >::value;
}

【讨论】:

    猜你喜欢
    • 2019-08-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多