gpt4 book ai didi

c++ - 使用可变参数模板解决 C++ 中的 mixin 构造函数问题

转载 作者:塔克拉玛干 更新时间:2023-11-03 00:37:00 27 4
gpt4 key购买 nike

我最近处理了 the constructor problem ,其中相互装饰的各种混合类(以及最顶层的宿主类)具有不同的构造函数签名。为了在生成的装饰类中维护单个构造函数,并且不添加 init 函数,我找到了以下解决方案。它对 mixin 类的唯一限制是,如果其构造函数采用多个参数,则应将它们全部封装在一个元组中。 (用 g++ 编译此代码需要 -std=c++0x 标志)

#include <boost/tuple/tuple.hpp>

// Base class for all mixins
struct Host {
float f_;
int i_;

Host(float f, int i) : f_(f), i_(i) {}
};

// First mixin--constructs with 1 parameter
template <class B>
struct M1 : public B {
char c_;

template <class... A>
M1(char c, const A&... a) : B(a...), c_(c) {}
};

// Second mixin--constructs with 3 parameters
template <class B>
struct M2 : public B {
double d_;
short s_;
const char* p_;

template <class... A>
M2(boost::tuple<const char*, double, short> t, const A&... a)
: B(a...), p_(t.get<0>()), d_(t.get<1>()), s_(t.get<2>()) {}
};


int main() {
// ctor parameters go in this order, from most derived to base:
M2<M1<Host>> tst(boost::make_tuple("test", 46.1, (short)-1), (char)5, 4.2f, 2);
return 0;
}

我的问题是:
1) 有没有更好、更优雅的方法用 C++0X 解决这个问题?
2) 具体来说,元组真的有必要吗?

最佳答案

如果你有多个构造函数,并且 mixins 的数量不同(因此存在歧义),你只需要元组之类的东西。

如果不是,您可以照常处理 mixin 的参数:

template <class... A>
M2(const char* p, double d, short s, const A&... a)
: B(a...), p_(p), d_(d), s_(s) {}

关于c++ - 使用可变参数模板解决 C++ 中的 mixin 构造函数问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3378796/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com