当前位置: 首页 > 知识库问答 >
问题:

执行static_assert以确定模板类型是另一个模板

籍星汉
2023-03-14

我如何像这样static_assert?也许Boost支持它,如果不是C++或C++11中的新特性?

template<T>
struct foo {};

template<FooType>
struct bar {
  static_assert(FooType is indeed foo<T> for some T,"failure"); //how?
};

共有2个答案

慕璞
2023-03-14

就像别人写的,

template<typename T, template<typename...> class TT>
struct is_specialization_of : std::false_type { };

template<template<typename...> class TT, typename... Ts>
struct is_specialization_of<TT<Ts...>, TT> : std::true_type { };

但是,要注意,这只适用于模板参数都是TypeNames的模板类!呈上

typedef std::array<int, 42> MyArray;
static_assert(is_specialization_of<MyArray, std::array>::value, "");

它将完全无法编译。

我相信C++11/C++14/C++17目前还没有办法处理这个限制。

澹台岳
2023-03-14

你可以在这方面做点什么。给定一个可以验证类是否是类模板的实例化的特征:

#include <type_traits>

template<typename T, template<typename> class TT>
struct is_instantiation_of : std::false_type { };

template<typename T, template<typename> class TT>
struct is_instantiation_of<TT<T>, TT> : std::true_type { };

在您的程序中按照以下方式使用它:

template<typename T>
struct foo {};

template<typename FooType>
struct bar {
  static_assert(is_instantiation_of<FooType, foo>::value, "failure");
};

int main()
{
    bar<int> b; // ERROR!
    bar<foo<int>> b; // OK!
}

如果需要,可以对其进行泛化,以检测类是否是具有任意数量(类型)参数的模板的实例,如下所示:

#include <type_traits>

template<template<typename...> class TT, typename T>
struct is_instantiation_of : std::false_type { };

template<template<typename...> class TT, typename... Ts>
struct is_instantiation_of<TT, TT<Ts...>> : std::true_type { };

template<typename FooType>
struct bar {
  static_assert(is_instantiation_of<foo, FooType>::value, "failure");
};

然后您可以在程序中这样使用它:

template<typename FooType>
struct bar {
  static_assert(is_instantiation_of<foo, FooType>::value, "failure");
};

int main()
{
    bar<int> b; // ERROR!
    bar<foo<int>> b; // OK!
}

这里有一个活生生的例子。

 类似资料:
  • 我有这样的代码 现在,为了打印值,如果T是一个类,我想调用对象的打印函数,但是如果T是一个基本数据类型,我只想使用printf。 那么,如何确定模板类型是基本数据类型还是类?

  • 问题内容: 我有一个非常基本的模板(basic_template.html),并希望使用使用另一部分模板格式化的数据来填写。basic_template.html可能包含使用部分模板格式化的几件事。 我应该如何在views.py中构建代码? 我这样做的原因是稍后将使用Ajax填充。我这样做对吗? 问题答案: 你可以做: 另一个Django模板在哪里。在这里,你可以放入将用Ajax获得的HTML。

  • 问题内容: 我想知道在Java中专门化泛型类型的选项是什么,即在模板化类中具有对某些类型的特定替代的选项。 在我的情况下,我是一个泛型类(类型T),通常返回null,但是当T为String类型时返回“”(空字符串),而当其Integer类型时返回0(零),等等。 仅提供方法的特定于类型的重载会产生“方法不明确”错误: 例如: 是用特定类型将泛型类子类化的唯一选择(请参见以下示例中的StringBa

  • 我想使用一个模板函数扩展默认的Golang模板函数,该模板函数呈现另一个Golang模板,而该模板也应该可以访问相关函数。 下面的演示案例应该创建一个< code>include模板函数,该函数呈现一个给定的模板,该模板也可以包含相同的< code>include函数。然而,这个例子(理所当然地)引发了一个初始化周期错误。 Golang 模板函数是否可以在引用自身时渲染另一个模板? https:/

  • 问题内容: 我有两个模板T1和T2。我想获取T1的输出,并在T2内对其进行一些额外的处理。我的问题是: 如何将T1的输出存储在T2的变量中?这有可能吗? 这是一些伪模板: 问题答案: 没有内置支持将模板结果存储在模板变量中,仅用于包含结果。 但是,您可以使用所需的任何复杂功能注册自定义功能。您可以注册一个函数,该函数将执行由其名称标识的模板,并且可以将结果返回为,可以将其存储在模板变量中。 这样做

  • 对于某些参数将成功实例化,而对于其他参数则不会。 不修改或扩展的定义,是否可以编写一个bool变量模板: 这样为真,是否会成功实例化? 这将输出,预期的输出是吗? 什么给?