c – 如何在同一个可变参数模板的不同实例之间进行转换?
发布时间:2020-12-16 10:04:02 所属栏目:百科 来源:网络整理
导读:假设我们有一个维护一组元素的数据结构Foo.应该可以根据需要将属性与元素相关联.属性应分别存储在单独的向量中.我们通过可变参数模板实现这一点: #include vectortemplate typename ...Attrsstruct Foo : public Attrs... { Foo(int n = 0) { using PackExp
假设我们有一个维护一组元素的数据结构Foo.应该可以根据需要将属性与元素相关联.属性应分别存储在单独的向量中.我们通过可变参数模板实现这一点:
#include <vector> template <typename ...Attrs> struct Foo : public Attrs... { Foo(int n = 0) { using PackExpansionT = int[]; PackExpansionT{0,(Attrs::values.resize(n),0)...}; } }; struct AttrA { std::vector<int> values; }; struct AttrB { std::vector<float> values; }; struct AttrC { std::vector<double> values; }; int main() { Foo<AttrA,AttrB> foo; // Maintains set of elements with two attributes each. }; 现在,我想要一个具有以下语义的转换运算符: Foo<AttrB,AttrC> bar = foo; // bar.AttrB::values should be a copy of foo.AttrB::values. 这只是一个例子.通常,转换运算符应该能够将具有任意属性的Foo转换为具有任意属性的另一个Foo.应复制与两个Foos关联的属性.与两者无关的属性可以保留默认值.但是,我不知道如何实现它. template <typename ...OthersAttrs> operator Foo<OthersAttrs...>() const { // ...? } 解决方法
我们可以做出一堆独立的决定.首先,让我们添加一个构造函数,以便我们可以从其属性成分构造Foo:
Foo(Attrs const&... attrs) : Attrs(attrs)... { } 接下来,对于Others中的每个属性,如果可能,我们将向下转换为适当的类型,否则返回默认构造的类型: template <typename... Others> operator Foo<Others...>() const { return {get_attr<Others>(this)...}; } 哪里: template <class T> T const& get_attr(T const* v) const { return *v; } template <class T> T get_attr(...) const { return T{}; } (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |