gpt4 book ai didi

c++ - 使用模板继承调用祖 parent 构造函数

转载 作者:塔克拉玛干 更新时间:2023-11-03 02:12:01 25 4
gpt4 key购买 nike

我选择使用模板化继承以避免多重继承和虚拟继承。我的目标是让各种 child (4 或 5 代或我无法控制的继承)有一个共同的函数调用,无论他们派生什么。

我的解决方案是这样插入一个模板继承:

template <typename BASE>
class common_call : public BASE {
public:
void foo() { /*implementation independent of base*/ }
};

class child1 : public common_call <base1> {};
class child2 : public common_call <base2> {};

这里有调用base的构造函数的问题。类 base1 和 base2(不是我写的)有不同的构造函数,我必须在初始化列表中调用它们。 common_call 模板对这些构造函数一无所知,但子类按照它们当前直接继承的方式进行操作。

我有什么办法可以做到这一点:

class child3 : public common_call<base3>{
public:
child3(param1, param2) : base3(param2) {/*do things here*/}
};

如果可能,我尽量避免为每种类型的基础进行部分模板特化。

最佳答案

如果你给 common_call 一个使用可变参数模板的模板构造函数,如下所示:

template <typename BASE>
class common_call : public BASE
{
public:
// C++11 variadic templates to define whole range of constructors
template<typename... Args>
common_call(Args&&... args)
:
BASE(std::forward<Args>(args)...)
{}

void foo() { /*implementation independent of base*/ }
};

然后您可以使用任何模板参数(例如 base3)从 common_call 派生并调用该类定义的任何构造函数

class child3
:
public common_call<base3>
{
public:
child3(Type1 param1, Type2 param2)
:
common_call(param2), // call constructor overload with 1 parameter of Type2
t1_(param1) // initialize t1_ member
{}

private:
Type1 t1_;
};

关于c++ - 使用模板继承调用祖 parent 构造函数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12487181/

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