c++ - 在编译时指定静态和动态大小

标签 c++ templates boost architecture software-design

目前,我有一个如下形式的类:

template <std::size_t N, 
          class T,
          class Allocator = typename std::conditional<N, void, std::allocator<T>>::type>
class myclass {};

这是一个具有以下行为的特定容器:

  • 如果 N > 0,则容器的静态大小为 NAllocator 模板参数应为 void
  • 如果 N == 0,则容器的大小是动态的,将使用 Allocator 参数。

但我对这个设计并不满意,因为它看起来不够优雅。我想要一个standard-likeboost-ready 的解决方案。可能其中一个boost库的设计已经遇到过这样的问题。如果是这样,选择了什么解决方案?

考虑到我想保留单个版本的 myclass,而不是两个版本的 static_myclassdynamic_myclass

最佳答案

这可能是 CRTP 的一个很好的用例。有一个完成所有重要工作的基类,它向其派生类询问实际对象:

template <typename Derived, typename T>
class myclass_base_impl { 
    // generic stuff
    // static_cast to Derived& to get actual data
};

那么,你就有了它的两个版本。动态的:

template <typename T>
class myclass_dynamic 
: public myclass_base_impl<myclass_dynamic<T>, T>
{
    /* stuff that uses std::allocator<T> */
};

静态的:

template <typename T, size_t N>
class myclass_static
: public myclass_base_impl<myclass_static<T, N>, T>
{
     // presumably something like
    T data_[N];
};

关于c++ - 在编译时指定静态和动态大小,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30806209/

相关文章:

c++ - 带有 boost : linker(Id) Warning about visibility settings 的 xcode

c++ - 如何使用 std::for_each 和 boost::bind 在参数上调用成员函数?

c++ - 如何复制 boost 信号的槽

c++ - 将导入的库链接到 CMake ExternalProject

c++ - 带 CDB 的 QtCreator 3 在调试器中显示错误值

c++ - SFINAE 有选择地纳入成员(member)

c++ - 什么时候使用大括号括起来的初始化器?

c++ - 如何获取基类的模板类型

c++ - 没有调用 for_each 的匹配函数

c++ - 有没有办法让空的 boost 循环缓冲区的前端在缓存中保持热?