type_traits - 连续的内存

时间:2015-10-11 17:30:44

标签: c++ c++11

我有一个处理任何容器类型的界面。 std::vectorstd::array,甚至是std::basic_string。问题在于没有什么可以阻止某人传递没有连续记忆的容器。

我目前的解决方案是delete我要阻止的那些接口。

void dosoemthing(const std::list&)=delete;
void dosoemthing(const std::map&)=delete;

但是,如果我可以根据类型特征添加静态断言,我更愿意。这引出了我的问题。它们是否存在容器的类型特征,可用于识别其内存是否连续?我已经通过documentation并且还没有找到任何东西。我想在将其标记为失败的原因之前,我会向A团队查询。

1 个答案:

答案 0 :(得分:7)

您可以使用自己的类型特征,然后使用static_assert进行验证:

#include <type_traits>
#include <vector>
#include <array>

template<typename T>
struct has_contiguous_memory : std::false_type {};

template<typename T, typename U>
struct has_contiguous_memory<std::vector<T, U>> : std::true_type {};

template<typename T>
struct has_contiguous_memory<std::vector<bool, T>> : std::false_type {};

template<typename T, typename U, typename V>
struct has_contiguous_memory<std::basic_string<T, U, V>> : std::true_type {};

template<typename T, std::size_t N>
struct has_contiguous_memory<std::array<T, N>> : std::true_type {};

template<typename T>
struct has_contiguous_memory<T[]> : std::true_type {};

template<typename T, std::size_t N>
struct has_contiguous_memory<T[N]> : std::true_type {};