Jon*_*Mee 2 c++ templates static-assert type-traits c++11
我浏览了清单,std::type_traits但没有找到与std容器有关的任何内容。
我正在寻找std在编译时将容器传递给模板类型的方法。
template < typename T >
void foo( T bar )
{
static_assert( is_std_container??? );
}
Run Code Online (Sandbox Code Playgroud)
它不存在。
如果知道应该支持的一组容器类型,则可以创建自己的特征:
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.
Run Code Online (Sandbox Code Playgroud)
您可以像其他特征一样使用它:
cout << is_container<std::vector<int>>::value << endl;
cout << is_container<int>::value << endl;
Run Code Online (Sandbox Code Playgroud)
在这里看到它。
注意,通常应该将迭代器传递给函数,而不是容器。因此,您可以使代码独立于容器,并且更加通用。
正如其他人在评论中回答的那样,没有标准的方法可以做到这一点。但是,您可以定义自己的特征系统来确定类型是否是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;
}
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
2839 次 |
| 最近记录: |