static_assert可以检查类型是否为向量? IE,int
会提出断言,而vector<int>
则不会
我想的是:
static_assert(decltype(T) == std::vector, "Some error")
答案 0 :(得分:20)
是。考虑以下元函数:
#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
中的表达方式。
答案 1 :(得分:10)
的C ++ 0x:
static_assert(std::is_same<T, std::vector<int>>::value, "Some Error");
答案 2 :(得分:2)
一般解决方案。给定类型和模板,以检查类型是否是后者的实例:
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")
注意:如果T
为const
,则无法直接使用。因此,请测试类似is_instance_of_a_given_class_template< std::decay_t<T> ,std::vector>
的内容。
答案 3 :(得分:0)
是强>
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;
注意:如果true
公开继承自T
,我的(复杂)答案会有一个限制,即评估为vector<>
。如果T从private
继承protected
/ vector<>
,则可能会导致编译器错误。只是保留它的记录,这种方式不应该使用!! :)