如何创建灵活的模板C ++

时间:2018-01-23 16:43:24

标签: c++ templates inheritance

我正在尝试创建抽象类,它是另一个类的模板。是否可以创建“灵活”template

有几个类将从这个继承,所有类都将具有相同名称但具有不同参数的函数。抽象类是继承类的“接口” - 我将使用这一个的指针来管理另一个。

例如,我们有两个类:ABfind类的A方法只需要type1类型,但B类的方法需要type1type2类型。

这就是我创建从模板继承的类的方法:

class A : public Repository<int> {
   public void find(int) override; };


class B : public Repository<int, float> {
   public void find(int a, float b) override; };

关于public关键字之后的部分。我不想在所有类中输入<int, float>

我有没有办法重载(?)template<typename type1, typename type2>和函数?

抽象类的代码。

#ifndef REPOSITORY_HPP
#define REPOSITORY_HPP

#include <string>

//template<typename type1>
template<typename type1, typename type2> 
    class Repository
{
    protected:
        typeSTRING name;

    public:

        virtual void find(type1) = 0;
        //virtual void find(type1, type2) = 0;
};

#endif

2 个答案:

答案 0 :(得分:4)

您需要基类中的可变参数模板,即

#include <iostream>

template <typename ... Args>
class Interface
{
  public:
    virtual void find(Args... args) = 0;
};

class Impl1 : public Interface<int>
{
  public:
    void find(int value) override
    {
      std::cout << "found" << value << std::endl;
    }
};

class Impl2 : public Interface<int, float>
{
  public:
    void find(int value, float other_value) override
    {
      std::cout << "found" << value << " " << other_value << std::endl;
    }
};

int main()
{
  Impl1 impl1 {};
  impl1.find(5);

  Impl2 impl2 {};
  impl2.find(5, 10.2);
}

答案 1 :(得分:1)

为了补充@KKMKK的以下评论,您可以从Args获取特定类型...(来自:get the Nth type of variadic template templates?):

template <typename ... Args>
class Interface
{
  public:
    using FirstType = typename std::tuple_element<0, std::tuple<Args...> >::type;

    virtual void add(FirstType) = 0;
    virtual void find(Args... args) = 0;
};

class Impl2 : public Interface<int, float>
{
  public:
    void add(int value) override
    {
      std::cout << "found" << value << std::endl;
    }
    void find(int value, float other_value) override
    {
      std::cout << "found" << value << " " << other_value << std::endl;
    }
};

int main()
{
  Impl2 impl2 {};
  impl2.add(5);
  impl2.find(5, 10.2);
}