【问题标题】:Specifying static and dynamic sizes at compile time在编译时指定静态和动态大小
【发布时间】:2015-08-28 15:34:34
【问题描述】:

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

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

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

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

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

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

【问题讨论】:

  • 用户是否可以提供Allocator 或者它只是用作内部实现?
  • @Jarod42 是的,用户可以提供分配器。
  • 删除N并创建一个特殊的“fixed_allocator”怎么样?

标签: c++ templates boost architecture software-design


【解决方案1】:

这可能是 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];
};

【讨论】:

  • 我同意这是一个优雅的实施解决方案。但我更多地谈论的是用户界面。例如,我将有 10 个像 myclass 这样的课程。显而易见的解决方案是复制界面并制作静态和动态版本。但它变得不那么方便了,例如,如果某些 myclass 需要两种尺寸规格。
  • @Vincent 我完全听不懂你的评论。
猜你喜欢
  • 2015-03-06
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-04-03
  • 1970-01-01
  • 1970-01-01
  • 2014-03-30
  • 2017-07-02
相关资源
最近更新 更多