[英]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.