初始化多个未知碱基类
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....???
};
我的第一个想法是:
- 参数包 "split" 类型。
- 2 个转换为参数包的元组。
对于这两种想法,我不知道这次如何,是否可以。
这里派上用场的是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"});
}
如果库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....???
};
我的第一个想法是:
- 参数包 "split" 类型。
- 2 个转换为参数包的元组。
对于这两种想法,我不知道这次如何,是否可以。
这里派上用场的是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"});
}