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

标签 c++ templates polymorphism variadic

问题 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/

相关文章:

c++ - C++中的模板函数重载

java - 当基本对象列表时,GSON 不包括鉴别器字段

c++ - 读取文件 on.get 函数时程序卡住

c++ - boost 文件系统获取权限返回 (509)dec == (1FD)hex。该值不在文档中

c++ - 阵列超出范围MQL5循环

java - doLayout 和 include in a template in 'Java Play!' 有什么区别?

c++ - 有什么方法可以确保我的函数是最后一个被调用的函数吗?

c++ - 在递归模板中通过引用传递模板函数

c# - 函数多态性。当 A 为 :B 时,返回 B,因为 A 为空

c++ - '{' token 之前的预期类名 - 带有头文件和 cpp 文件