选择模板参数包中的每个偶数(或奇数)参数
我想允许使用我正在编写的类来指定类型列表以及这些类型的分配器列表作为模板参数,其中类型位于奇数位置,分配器位于偶数位置:
template<typename... T>
class MyClass {
// Stuff inside
}
int main() {
MyClass<SomeType1, AllocatorOfSomeType1> c1;
MyClass<SomeType1, AllocatorOfSomeType1,
SomeType2, AllocatorOfSomeType2> c2;
MyClass<SomeType1, AllocatorOfSomeType1,
SomeType2, AllocatorOfSomeType2,
SomeType3, AllocatorOfSomeType3> c3;
// And so on....
}
在内部 是有意义的
std::tuple<std::vector<EveryOddTypeInParameterPack>...> m_storage_;
拥有一个用于存储的类型向量元组和一个用于使用的分配器元组
std::tuple<std::vector<EveryEvenTypeInParameterPack>...> m_storage_;
:我如何在代码中实际声明这些元组?理论上,我需要以某种方式选择参数包中的每个奇数/偶数类型 - 这可能吗?
I would like to allow use of the class I'm writing to specify as a template parameters a list of types along with a list of allocators of those types in a manner that types are at odd positions and allocators are at even ones:
template<typename... T>
class MyClass {
// Stuff inside
}
int main() {
MyClass<SomeType1, AllocatorOfSomeType1> c1;
MyClass<SomeType1, AllocatorOfSomeType1,
SomeType2, AllocatorOfSomeType2> c2;
MyClass<SomeType1, AllocatorOfSomeType1,
SomeType2, AllocatorOfSomeType2,
SomeType3, AllocatorOfSomeType3> c3;
// And so on....
}
Internally it would make sense to have a tuple of vectors of types for storage:
std::tuple<std::vector<EveryOddTypeInParameterPack>...> m_storage_;
and a tuple of allocators for usage:
std::tuple<std::vector<EveryEvenTypeInParameterPack>...> m_storage_;
How can I actually declare those tuples in code? In theory I need to somehow select every odd/even type in parameter pack - is that possible?
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(4)
虽然代码有点长,但我想该机制没有
不必要的特性。
如果我正确理解了这个问题,
可能下面的代码可以满足目的:
这是对 ideone 的测试。
Though the code got a little lengthy, I suppose the mechanism doesn't have
unnecessary peculiarities.
If I understand the question correctly,
probably the following code will meet the purpose:
Here is a test on ideone.
也许是这样的:
您仍然需要定义您的
MyContainer
类来对可变参数执行一些有用的操作,例如实现您的向量元组...(但为什么不是元组向量?)到 brunocodutra 用于元组技巧。
Perhaps something like this:
You still have to define your
MyContainer
class to do something useful with the variadic parameters, e.g. implement your tuple of vectors... (why not a vector of tuples, though?)Credits to brunocodutra for the tuple trick.
这只是一次尝试,
可能我还不够清楚,你可能想阅读
http://www.open-std。 org/jtc1/sc22/wg21/docs/papers/2006/n2080.pdf
还有一篇与分配器设计相关的好帖子类型...您想看看:
分配器类型参数的 C++ 设计模式
this is just a try
may be i'm not clear enough, you'd probably like to read
http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2006/n2080.pdf
Also there is a good post related to design of allocator types... you would like to have a look at:
C++ Design Pattern for allocator type arguments
我知道你的问题最初被标记为“c++11”,但我认为值得向后代指出,在 C++14 中你可以访问
make_index_sequence
,这使得整个事情变得非常简单。为了过滤元组,我将从以下大纲开始: https:// quuxplusone.github.io/blog/2018/07/23/metafilter/然后我们最终得到这样的结果(Godbolt):
要获得
just_odds
,您需要从切换条件是 % 2 == 0
到是 % 2 != 0
。用法示例:
I know your question was originally tagged "c++11", but I figure it's worth pointing out for posterity that in C++14 you have access to
make_index_sequence
, and that makes the whole thing pretty simple. For filtering a tuple, I'd start with this outline: https://quuxplusone.github.io/blog/2018/07/23/metafilter/And then we end up with something like this (Godbolt):
To get
just_odds
, you'd switch the condition fromIs % 2 == 0
toIs % 2 != 0
.Example usage: