如何定义通用模板签名
How to define generic template signature
>我有 2 个类,其中的函数是复制和粘贴的。这些类之间的唯一区别是每个类继承。这些超类具有相同的调用签名,但构造函数不同。
我试图做这样的事情:
template<class BaseClass>
class IGenericPart : public BaseClass {
public:
int commonCall1() { return 10; }
int commonCall2() { return 44; }
};
class A : public IGenericPart<RealBaseClass1> {
public:
A(int x) : IGenericPart<RealBaseClass1> (x, b) {}
};
class B : public IGenericPart<RealBaseClass2> {
public:
B(string z) : IGenericPart<RealBaseClass2> (z, anothertype2, anothertype2) {}
};
但是我不知道如何使IGenericPart
类具有基于泛型BaseClass
的前向构造函数。所以基本上,我需要IGenericPart<RealBaseClass1>
和IGenericPart<RealBaseClass2>
有不同的构造函数。
你只是缺少一个using
声明。
当类 IGenericPart<>
继承自BaseClass
时,它不会自动继承BaseClass
的构造函数。若要继承构造函数,必须使用 using
声明显式执行此操作,如下所示:
template<class BaseClass>
class IGenericPart : public BaseClass {
public:
using BaseClass::BaseClass;
// etc ...
};
然后,这将为IGenericPart<BaseClass>
创建构造函数,这些构造函数与BaseClass
的每个构造函数相对应并转发给每个构造函数,因此A
和B
的初始化列表将按预期工作。
请注意,构造函数继承是 C++11 功能,因此必须使用支持 C++11 的编译器在 C++11 模式下进行编译才能正常工作。
如果由于某种原因无法使用 c++11,您可以通过向 IGenericPart 添加以下笨拙的位来使其工作:
template<class BaseClass>
class IGenericPart: public BaseClass {
public:
template <typename A>
IGenericPart(A a) : BaseClass(a) {}
template <typename A, typename B>
IGenericPart(A a, B b) : BaseClass(a, b) {}
template <typename A, typename B, typename C>
IGenericPart(A a, B b, C c) : BaseClass(a, b, c) {}
}
相关文章:
- 在提升multi_index容器中,是否定义了"default index"?
- #定义c-预处理器常量..我做错了什么
- 用C++中的一个变量定义一个常量
- 部分定义/别名模板模板参数
- C++映射:具有自定义类的运算符[]不起作用(总是返回0)
- #为""定义宏;静态";针对不同的上下文
- 如何确保C++函数在定义之前声明(如override关键字)
- 创建一个函数以在输入为负数或零时输出字符串.第一次执行用户定义的函数
- 当类在C++中定义时,有什么方法可以"register"类吗?
- 在命名空间中定义函数还是限定函数
- 此代码是否违反一个定义规则
- 编译C++时未定义的引用
- 不同翻译单元中不可重载的非内联函数定义
- 为什么在定义函数之前先声明它
- 有没有什么方法可以使用一个函数中定义的常量变量,也可以由c++中同一程序中的其他函数使用
- 在类定义之后定义一个私有方法
- 是否可以使用单个定义定义函数的常量和常规版本?(使用模板,自动,decltype等)
- Eclipse CDT将方法定义定义到标头文件
- 什么是C++中的不确定行为?它与未定义的行为有何不同
- LEX 程序中的未定义定义