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

标签 c++ c++11 type-conversion variadic-templates

假设我们有一个维护一组元素的数据结构 Foo。应该可以根据需要将属性与元素相关联。每个属性都应该存储在一个单独的 vector 中。我们通过可变参数模板实现这一点:

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

关于c++ - 如何在同一可变参数模板的不同实例之间进行转换?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39711820/

相关文章:

c++ - 在不破坏多字节序列的情况下找到最长的 UTF-8 序列

c++ - 我应该如何处理 C++ 中的字符串参数?

C++ 转换运算符重载

c++ - 为什么 std::cout 如此耗时?

c++ - 我是否应该发送 std::set 以使用引用功能?

spring-mvc - Spring 3 类型转换错误

c++ - 将 C++ 结构成员从非常量转换为常量

c++ - 优化 OpenGL 渲染

c++ - 使用概念或 SFINAE 检查类是否具有带有 std::array 参数的模板化成员函数

c++ - 如何重载 static 和 dynamic_pointer_cast