加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 百科 > 正文

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{};
}

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读