代码之家  ›  专栏  ›  技术社区  ›  Ken Y-N

将构造函数参数变成模板参数

  •  1
  • Ken Y-N  · 技术社区  · 8 年前

    我有一个自制的环缓冲类,如下所示:

    template<typename T, int maxElements>
    class RingBuffer
    {
    };
    
    class Foo
    {
        RingBuffer<int, 2000> ring;
    };
    

    boost::circular_buffer 显示在整个代码中节省了7%。但是,我需要显式地构造 这样地:

    class Foo
    {
        boost::circular_buffer<int> ring;
    public:
        Foo() : ring(2000) {}
    };
    

    boost::循环缓冲区 有话要说:

    class Foo
    {
        auto_construct<boost::circular_buffer<int>, 2000> ring;
    };
    

    所以我不需要再碰 Foo::Foo()

    更新 :虽然类内初始化器很接近,但我也有 typedef 学生:

    using Ring200 = RingBuffer<int, 2000>;
    

    using BoostRing2000 = auto_construct<boost::circular_buffer<int>, 2000>;
    

    所以我不需要记住 {2000} 每次我申报一个。

    2 回复  |  直到 8 年前
        1
  •  2
  •   lubgr    8 年前

    对于 Foo 包装纸。

    template <std::size_t N> struct Foo {
       boost::circular_buffer<int> ring{N};
    };
    

    适当的类型别名是

    using BoostRing2000 = Foo<2000>;
    

    如果希望保持实际存储数据类型的灵活性,可以添加另一个模板参数,以便

    template <class T, std::size_t N> struct Foo {
       boost::circular_buffer<T> ring{N};
    };
    

    它允许对类型别名进行细粒度控制,例如。

    using BoostIntRing2000 = Foo<int, 200>;
    template <class T> using BoostRing2000 = Foo<T, 200>;
    

    实例现在读取

    BoostIntRing2000 someIntegerRing;
    BoostRing2000<double> someDoubleRing;
    
        2
  •  4
  •   StoryTeller - Unslander Monica    8 年前

    默认的成员初始值设定项可以做到。

    class Foo
    {
        boost::circular_buffer<int> ring{2000};
    };
    

    假设你的意图只是触及成员定义。它还有一个优点,如果你改变了对一个特定构造函数的想法,修改它就不麻烦了。只需在该任务中添加一个成员初始值设定项,就完成了。


    根据编辑,我对 boost 他们可以做你想做的事。但是另一种方法,也可以节省一些替代品,就是实现你的自制 RingBuffer 作为一个薄薄的包裹物 boost::circular_buffer

    template<typename T, int maxElements>
    class RingBuffer : boost::circular_buffer<T> // Can also be a member instead of privately inherited
    {
      // Now pull what we need with using delcarations and define a c'tor
    
       public:
    
       RingBuffer() : boost::circular_buffer<T>(maxElements) {}
    };