我正在尝试创建抽象类,它是另一个类的模板。是否可以创建“灵活”template
?
有几个类将从这个继承,所有类都将具有相同名称但具有不同参数的函数。抽象类是继承类的“接口” - 我将使用这一个的指针来管理另一个。
例如,我们有两个类:A
和B
。
find
类的A
方法只需要type1
类型,但B
类的方法需要type1
和type2
类型。
这就是我创建从模板继承的类的方法:
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
答案 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);
}