gpt4 book ai didi

C++ 多态性和可变参数模板

转载 作者:行者123 更新时间:2023-11-27 23:02:30 25 4
gpt4 key购买 nike

问题 1:我有以下代码:

template<typename T, typename S>
class Base {
virtual void fun(const T& arg1, const S& arg2) = 0;
private:
T v1;
S v2;
};

class Derived1 : public Base<int, double> {
public:
virtual void fun(int &arg1, double &arg2) override {
// do some special stuff
}
};

class Derived2 : public Base<float, int> {
public:
virtual void fun(float &arg1, int &arg2) override {
// do some special stuff
}
};

我需要在单个 vector 中收集对这些对象(Derived1 和 Derived2)的所有引用以循环遍历它们并在每个对象上调用 fun。

问题 2:同样的问题,但是 base 现在有可变模板参数

template<typename T, typename ... S>
class Base {
virtual void fun(const T& arg1) = 0;
private:
T v1;
std::tuple<std::vector<S>...> v2;
};

class Derived1 : public Base<int, double, int, int> {
public:
virtual void fun(int &arg1) override {
// do some special stuff
}
};

class Derived2 : public Base<float, int, double, double> {
public:
virtual void fun(float &arg1) override {
// do some special stuff
}
};

有没有一种方便的方法可以将对 Derived1 和 Derived2 对象的所有引用收集到一个 vector 中?

最佳答案

所以您对什么是模板存在根本性的误解。 Variadic 与您的问题无关。

采用以下模板:

template <typename T>
class Foo
{
T member_;
public:
Foo(){}
T& member() {return member_;}
virtual bar() {printf("bar");}
};

int main(int argc,char* argv)
{
Foo<int> a;
Foo<string> b;
}

a的类型之间有什么关系?和 b ?答案是没有。当然,它们来自相同的代码库,但它们是完全不同的类型,具有不同的大小、接口(interface)等。对于模板特化,您无法保证它们的相似程度。

您正在尝试做的是模板化多态类的派生。所以就这样做,即:

class Bar
{
public:
virtual bar() = 0;
};
template <typename T>
class Foo : public Bar
{
T member_;
public:
Foo(){}
T& member() {return member_;}
virtual bar() {printf("bar");}
};

然后就可以收集所有的东西,访问Bar的界面了。

就像所有的继承一样,你可以继续提供子类:

 class Derived1 : public Foo<int> { virtual bar() {printf("derived1");}};
class Derived2 : public Foo<string> { virtual bar() {printf("derived2");}};

Derived1Foo<int>Bar , Derived1Foo<string>Bar .

关于C++ 多态性和可变参数模板,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26368691/

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