如何检测容器是否保证具有序列存储

Vor*_*rac 2 c++ containers stl c++11

检查序列容器是否在内存中是连续的.
仅接受某些类型的C++模板

我正在编写一个简单的send()方法,它在内部使用C风格的指针.我希望它能够使用所有保证的序列容器.我的动机是双重的:

  • 灵活的界面
  • 效率 - 使用std::array避免堆分配.

这是我有多远:

template <typename Container>
void poll( Container &out )
{
    static_assert( std::is_base_of< std::array<typename Container::value_type>, Container >::value  ||
                   std::is_base_of< std::vector<typename Container::value_type>, Container >::value ||
                   std::is_base_of< std::string<typename Container::value_type>, Container >::value,
                   "A contiguous memory container is required.");
}
Run Code Online (Sandbox Code Playgroud)

麻烦的是,std::array需要第二个参数,并且在编译时无法知道.这个问题可以解决吗?可能采用不同的方法?

Mar*_*low 7

如果容器有data()成员函数怎么样?(返回指针)


Fla*_*ire 7

这里正确的方法是使用特质类.std::is_base_of是一种特质.基本上:您有一个模板化结构,它接受(模板)参数并通过嵌套类型/值返回其结果.

在你的情况下这样的事情

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

template<typename T>
struct HasContiguousStorage<std::vector<T>>: public std::true_type{};
// Specialize others
Run Code Online (Sandbox Code Playgroud)

因为你不应该从标准容器派生,这应该就足够了.这也可以检查数组:

template<typename T, size_t N>
struct HasContiguousStorage<std::array<T,N>>: public std::true_type{};
Run Code Online (Sandbox Code Playgroud)

在您的函数中,您可以重载它(请参阅参考资料enable_if)或在其上分支(分支将在编译时进行评估)