簡體   English   中英

使構造函數參數成為模板參數

[英]Make a constructor parameter into a template parameter

我有一個自制的環形緩沖區類,如下所示:

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

class Foo
{
    RingBuffer<int, 2000> ring;
};

這是一個性能瓶頸,因為用boost::circular_buffer進行的快速替換顯示出整體代碼節省了7%。 但是,我需要像這樣顯式構造boost::circular_buffer

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

是否有一個簡潔的習慣用法(或者實際上是另一個Boost模板!),我可以使用以下方法包裝boost::circular_buffer

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}時都不需要記住它。

默認成員初始化程序可以執行。

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

假設您的意圖是僅觸摸成員定義。 它還具有以下優點:如果您改變主意以使用特定的構造函數,則無需擔心修改。 只需將成員初始化器添加到該c'tor即可完成。


由於編輯,我不熟悉的東西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) {}
};

您仍然可以為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;

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM