C++ 将构造函数参数转换为模板参数

C++ 将构造函数参数转换为模板参数,c++,boost,idioms,C++,Boost,Idioms,我有一个像这样的自制环形缓冲区类: template<typename T, int maxElements> class RingBuffer { }; class Foo { RingBuffer<int, 2000> ring; }; class Foo { boost::circular_buffer<int> ring; public: Foo() : ring(2000) {} }; 有没有一个简洁的习惯用法(或者确实

我有一个像这样的自制环形缓冲区类:

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

class Foo
{
    RingBuffer<int, 2000> ring;
};
class Foo
{
    boost::circular_buffer<int> ring;
public:
    Foo() : ring(2000) {}
};
有没有一个简洁的习惯用法(或者确实是另一个Boost模板!)我可以用它来包装
Boost::circular\u buffer
,比如:

class Foo
{
    auto_construct<boost::circular_buffer<int>, 2000> ring;
};
因此,我想:

using BoostRing2000 = auto_construct<boost::circular_buffer<int>, 2000>;
使用BoostRing2000=auto_构造;

这样我就不需要每次声明
{2000}
时都记住它。

默认成员初始值设定项可以做到这一点

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

可以使用默认成员初始值设定项

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

对于
Foo
包装器,您仍然可以使用带有非类型模板参数的类内初始值设定项

template <std::size_t N> struct Foo {
   boost::circular_buffer<int> ring{N};
};
模板结构Foo{
循环缓冲环{N};
};
合适的类型别名是

using BoostRing2000 = Foo<2000>;
使用BoostRing2000=Foo;
如果希望保持存储的数据的实际类型灵活,可以添加另一个模板参数,以便

template <class T, std::size_t N> struct Foo {
   boost::circular_buffer<T> ring{N};
};
模板结构Foo{
循环缓冲环{N};
};
允许对类型别名进行细粒度控制,例如

using BoostIntRing2000 = Foo<int, 200>;
template <class T> using BoostRing2000 = Foo<T, 200>;
使用BoostIntRing2000=Foo;
使用BoostRing2000=Foo的模板;
现在实例化为

BoostIntRing2000 someIntegerRing;
BoostRing2000<double> someDoubleRing;
BoostIntRing2000 someintegring;
Boostring双环;

对于
Foo
包装器,您仍然可以使用带有非类型模板参数的类内初始值设定项

template <std::size_t N> struct Foo {
   boost::circular_buffer<int> ring{N};
};
模板结构Foo{
循环缓冲环{N};
};
合适的类型别名是

using BoostRing2000 = Foo<2000>;
使用BoostRing2000=Foo;
如果希望保持存储的数据的实际类型灵活,可以添加另一个模板参数,以便

template <class T, std::size_t N> struct Foo {
   boost::circular_buffer<T> ring{N};
};
模板结构Foo{
循环缓冲环{N};
};
允许对类型别名进行细粒度控制,例如

using BoostIntRing2000 = Foo<int, 200>;
template <class T> using BoostRing2000 = Foo<T, 200>;
使用BoostIntRing2000=Foo;
使用BoostRing2000=Foo的模板;
现在实例化为

BoostIntRing2000 someIntegerRing;
BoostRing2000<double> someDoubleRing;
BoostIntRing2000 someintegring;
Boostring双环;

类内初始值设定项是否符合“不接触
Foo::Foo()
”的条件?我的意思是
structfooo{boost::circular_缓冲环{2000};}。我忘记了那个功能,现在离它越来越近了,但让我更新我的问题,因为我有
typedef
s。类内初始值设定项是否符合“不接触
Foo::Foo()
”的条件?我的意思是
structfooo{boost::circular_缓冲环{2000};}
。我忘记了那个功能,现在离它越来越近了,但让我更新我的问题,因为我有
typedef
s。我认为您应该将它推广到接受任何
T
。但除此之外,我还有一个投票:)@StoryTeller我也考虑过它,但后来决定让
Foo
封装类型,赋予它更多的意义,而不仅仅是避免构造函数调用。但是我有点确信,我会在答案中添加这个选项:)我认为你应该把它推广到接受任何
T
。但除此之外,我还有一个投票:)@StoryTeller我也考虑过它,但后来决定让
Foo
封装类型,赋予它更多的意义,而不仅仅是避免构造函数调用。但我有点确信,我会在答案中添加这个选项:)