繁体   English   中英

如何在同一个可变参数模板的不同实例之间进行转换?

[英]How to convert between different instantiations of the same variadic template?

假设我们有一个维护一组元素的数据结构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。 应复制与两个Foo相关的属性。 与两者无关的属性可以保留默认值。 但是,我不知道如何实现它。

  template <typename ...OthersAttrs>
  operator Foo<OthersAttrs...>() const {
    // ...?
  }

我们可以做出一堆独立的决定。 首先,让我们添加一个构造函数,以便我们可以从其属性成分构造Foo

Foo(Attrs const&... attrs)
: Attrs(attrs)...
{ }

接下来,对于每个属性Others ,我们要么垂头丧气this为适当的类型如果可能的话,或者返回一个缺省构造一个以其他方式:

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

我能想到的大纲:

template <typename ...OthersAttrs>
operator Foo<OthersAttrs...>() const
{
    Foo<OthersAttrs...> rv(GetNSomehow());
    (int[]){(CopyAttr<Attrs>(&rv), 0)...};
    return rv;
}

template<typename Attr>
void CopyAttr(Attr *rv) const // Overload A
{
    rv->values = ((const Attr*)this)->values;
}

template<typename Attr>
void CopyAttr(...) const // Overload B
{

}

这里的技巧是逐个属性。
如果rv具有该属性,则将选择第一个重载并将其复制。
否则,将选择不执行任何操作的第二个过载。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM