用于std容器的type_traits
type_traits for std Container?
我查看了std::type_traits
的列表,但没有看到任何与std
容器相关的内容。
我正在寻找验证std
容器在编译时被传递到模板类型。
template < typename T >
void foo( T bar )
{
static_assert( is_std_container??? );
}
不存在
如果你知道应该支持的容器类型集,你可以创建自己的trait:
template<class T>
struct is_container
{
static const bool value = false;
};
template<>
template<class T, class Alloc>
struct is_container<std::vector<T, Alloc>>
{
static const bool value = true;
};
// ... same specializations for other containers.
你可以像使用其他特征一样使用它:
cout << is_container<std::vector<int>>::value << endl;
cout << is_container<int>::value << endl;
看这里
注意,通常应该将迭代器传递给函数,而不是容器。因此,您可以保持代码与容器无关,并且更加通用。
正如其他人在评论中回答的那样,没有标准的方法来做到这一点。但是,您可以定义自己的trait系统来确定类型是否为std
容器,就像下面的示例一样:
#include <iostream>
#include <vector>
#include <set>
#include <map>
#include <list>
#include <deque>
#include <unordered_set>
#include <unordered_map>
#include <type_traits>
template <typename T> struct container_traits {
static bool const value = false;
};
template <typename... Args>
struct container_traits<std::vector<Args...>> {
static bool const value = true;
};
template <typename... Args>
struct container_traits<std::deque<Args...>> {
static bool const value = true;
};
template <typename... Args>
struct container_traits<std::list<Args...>> {
static bool const value = true;
};
template <typename... Args>
struct container_traits<std::set<Args...>> {
static bool const value = true;
};
template <typename... Args>
struct container_traits<std::map<Args...>> {
static bool const value = true;
};
template <typename... Args>
struct container_traits<std::unordered_set<Args...>> {
static bool const value = true;
};
template <typename... Args>
struct container_traits<std::unordered_map<Args...>> {
static bool const value = true;
};
template<typename T>
struct is_std {
static constexpr bool const value = container_traits<T>::value;
};
auto main() -> int {
std::vector<int> v;
std::cout << std::boolalpha << is_std<decltype(v)>::value << std::endl;
std::deque<int> dq;
std::cout << std::boolalpha << is_std<decltype(dq)>::value << std::endl;
std::set<int> s;
std::cout << std::boolalpha << is_std<decltype(s)>::value << std::endl;
std::map<int, int> m;
std::cout << std::boolalpha << is_std<decltype(m)>::value << std::endl;
std::unordered_set<int> us;
std::cout << std::boolalpha << is_std<decltype(us)>::value << std::endl;
std::unordered_map<int, int> um;
std::cout << std::boolalpha << is_std<decltype(um)>::value << std::endl;
std::list<int> l;
std::cout << std::boolalpha << is_std<decltype(l)>::value << std::endl;
int i;
std::cout << std::boolalpha << is_std<decltype(i)>::value << std::endl;
double d;
std::cout << std::boolalpha << is_std<decltype(d)>::value << std::endl;
return 0;
}
演示相关文章:
- 使用 [] 运算符时"binding reference of type discards qualifiers"
- 在 QVector<std::unique_ptr 上使用 std::find<Type>>
- 在类型和包装器之间reinterpret_cast是否安全<Type>?
- 使用 cmake 的 Linux 终端上的"Conversion to non-scalar type is requested"错误
- 控制到达非空函数clang(-Wreturn-type)的末尾
- std::unordered_map 类型对象声明期间出现"field has incomplete type"错误
- 如何将 std::ifstream 转换为 std::basic_istream<CharT, Traits>&?
- 将系数存储在头文件的数组中("does not name a type"错误)
- 尝试打开 ifstream 时出现"Incomplete type"错误
- 将成员函数作为构造函数参数调用时出错 "Variable is not a type name"
- 在"结构提升::enable_if<提升::is_pod<T>,无效>"中没有名为"type"的类型
- "Missing type specifier - int assumed"无法通过向主函数添加"return 0"来解决
- OpenCV CV_16F type
- C++ "错误:在'类 std::result_of< ... >"中没有名为'type'的类型"
- 将内存分配返回值强制转换为 TYPE 数组
- C++ 一个lambda浅拷贝const Type&如果它被赋予一个命名捕获,如[copy=val](){}?
- reference_wrapper导致"incomplete type is not allowed"
- 继承类时"invalid use of incomplete type ‘class tree_node_t’"
- 由于"error C4430: missing type specifier - int assumed. Note: C++ does not support default-int",我现在无法编
- cv::D ataType<> 与 cv::traits::Type<>