初始化多个未知碱基类

Initialize more than one unknown base classes

如果库class不知道库(客户端知道),那么处理它的构造函数就不那么困难了。代码如下所示:

template<typename Parent>
struct AAAAA : public Parent
{
    using Parent::Parent;

    template<typename ...Args>
    AAAAA(int a, int b, Args ...args) : Parent(args...) {}
};

如果所有 >1 个碱基 class 未知,最好的方法是什么?

template<typename P1, typename P2>
struct AAAAA : public P1, public P2
{
    // ...CTOR....???
};

我的第一个想法是:

对于这两种想法,我不知道这次如何,是否可以。

这里派上用场的是std::make_from_tuple

这就是如何将元组用于单个 parent:

#include <tuple>
struct foo { 
    foo(int,double){}
    foo(const foo&) = delete;
    foo(foo&&) = default;     
};

template<typename Parent>
struct A : public Parent
{
    template<typename T>
    A(const T& args) : Parent(std::make_from_tuple<Parent>(args)) {}
};

int main() {
    A<foo> a{std::make_tuple(1,2.0)};
}

添加第二个 parent 应该很简单。

请注意,Parent 必须至少为 move-constructible 才能使此工作正常进行。

您可以要求客户提供已经构造好的对象。它很容易理解,不需要太多的输入。这要求它们是可移动构造的。

#include <iostream>
#include <utility>

struct foo { 
    foo(int x, double y) { std::cout << x << ' ' << y << '\n'; }
};

struct bar { 
    bar(const std::string& x) { std::cout << x << '\n'; }
};

template<typename P1, typename P2>
struct A : public P1, public P2 {
    A(P1&& p1, P2&& p2) : P1(std::move(p1)), P2(std::move(p2)) {}
};

int main() {
    A<foo, bar> afb({1, 2.3}, {"hello"});
}