static_assert 可以检查类型是否是向量吗?

发布于 2024-11-28 02:13:03 字数 197 浏览 1 评论 0原文

static_assert 可以检查类型是否是向量吗? IE 中,int 会引发断言,而 vector 则不会。
我正在考虑以下内容:

static_assert(decltype(T) == std::vector, "Some error")

Can static_assert check if a type is a vector? IE, an int would raise the assertion, whereas a vector<int> would not.
I'm thinking of something along the lines of:

static_assert(decltype(T) == std::vector, "Some error")

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(4

乜一 2024-12-05 02:13:03

是的。考虑以下元函数:

#include <stdio.h>
#include <vector>

template <class N>
struct is_vector { static const int value = 0; };

template <class N, class A>
struct is_vector<std::vector<N, A> > { static const int value = 1; };

int main()
{
   printf("is_vector<int>: %d\n", is_vector<int>::value);
   printf("is_vector<vector<int> >: %d\n", is_vector<std::vector<int> >::value);
}

只需将其用作 static_assert 中的表达式即可。

Yes. Consider the following meta function:

#include <stdio.h>
#include <vector>

template <class N>
struct is_vector { static const int value = 0; };

template <class N, class A>
struct is_vector<std::vector<N, A> > { static const int value = 1; };

int main()
{
   printf("is_vector<int>: %d\n", is_vector<int>::value);
   printf("is_vector<vector<int> >: %d\n", is_vector<std::vector<int> >::value);
}

Simply use that as your expression in static_assert.

梦一生花开无言 2024-12-05 02:13:03

c++0x:

static_assert(std::is_same<T, std::vector<int>>::value, "Some Error");

c++0x:

static_assert(std::is_same<T, std::vector<int>>::value, "Some Error");
迷荒 2024-12-05 02:13:03

一个通用的解决方案。给定一个类型和一个模板,检查该类型是否是后者的实例:

template<typename T, template<typename...> class Tmpl>
struct is_instance_of_a_given_class_template : std:: false_type {};
template<template<typename...> class Tmpl, typename ...Args>
struct is_instance_of_a_given_class_template< Tmpl<Args...>, Tmpl > : std:: true_type {};

有了这个,则以下内容将为真:

is_instance_of_a_given_class_template<    vector<int>  ,  vector  > :: value
                    type to check  ~~~~~~~^               ^
        template to check against  ~~~~~~~~~~~~~~~~~~~~~~~/

因此您将使用:

static_assert( is_instance_of_a_given_class_template<T,std::vector>::value
              , "Some error")

注意:如果Tconst,这不能直接工作。因此,测试类似 is_instance_of_a_given_class_templateis_instance_of_a_given_class_template< std::decay_t,std::vector> 代替。

A general solution. Given a type, and a template, to check if the type is an instance of the latter:

template<typename T, template<typename...> class Tmpl>
struct is_instance_of_a_given_class_template : std:: false_type {};
template<template<typename...> class Tmpl, typename ...Args>
struct is_instance_of_a_given_class_template< Tmpl<Args...>, Tmpl > : std:: true_type {};

With this, then the following will be true:

is_instance_of_a_given_class_template<    vector<int>  ,  vector  > :: value
                    type to check  ~~~~~~~^               ^
        template to check against  ~~~~~~~~~~~~~~~~~~~~~~~/

and therefore you would use:

static_assert( is_instance_of_a_given_class_template<T,std::vector>::value
              , "Some error")

Note: If T is const, this won't work directly. So test for something like is_instance_of_a_given_class_template< std::decay_t<T> ,std::vector> instead.

一向肩并 2024-12-05 02:13:03

template<typename T>
struct isVector
{
  typedef char (&yes)[2];
  template<typename U>
  static yes check(std::vector<U>*);
  static char check(...);

  static const bool value = (sizeof(check((T*)0)) == sizeof(yes));
};

用法:

isVector<vector<int> >::value;
isVector<int>::value;

演示

注意:我的(复杂的)答案有一个限制,如果T是从vector<>公开继承的,则它的计算结果为true。如果 T 具有来自 vectorprivate/protected 继承,可能会导致编译器错误。只是保留下来作为记录,不应该使用这种方式! :)

Yes.

template<typename T>
struct isVector
{
  typedef char (&yes)[2];
  template<typename U>
  static yes check(std::vector<U>*);
  static char check(...);

  static const bool value = (sizeof(check((T*)0)) == sizeof(yes));
};

Usage:

isVector<vector<int> >::value;
isVector<int>::value;

Demo.

Note: My (complicated) answer has a limitation that it evaluates to true if if T is publically inherited from vector<>. It might result in compiler error if T has private/protected inheritance from vector<>. Just keeping it for record, that this way should not be used !! :)

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文