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
封装类型,赋予它更多的意义,而不仅仅是避免构造函数调用。但我有点确信,我会在答案中添加这个选项:)