我有一个处理任何容器类型的界面。 std::vector
,std::array
,甚至是std::basic_string
。问题在于没有什么可以阻止某人传递没有连续记忆的容器。
我目前的解决方案是delete
我要阻止的那些接口。
void dosoemthing(const std::list&)=delete;
void dosoemthing(const std::map&)=delete;
但是,如果我可以根据类型特征添加静态断言,我更愿意。这引出了我的问题。它们是否存在容器的类型特征,可用于识别其内存是否连续?我已经通过documentation并且还没有找到任何东西。我想在将其标记为失败的原因之前,我会向A团队查询。
答案 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 {};