C++ - 模板类专用化是否有办法包含常规模板中的代码
C++ - Is there a way for a template class specialization to contain code from the general template?
给定一个C++类:
template<typename T>
class A {
public:
int a;
T x;
int getA() {return a;}
};
模板专用化是否可以从 A "继承"(没有实际C++继承(成员,如 a 和 getA((?此外,在编写为类执行大量模板专用化的代码时,我应该多次键入相同的代码(这有点违背模板的全部目的(,还是重组类以使其适应专用化(例如,通过将另一个模板类成员封装在里面,以便专用化仅限于该类(?
模板专用化是否可以从 A "继承"(没有实际C++继承(成员,如 a 和 getA((?
简短的回答:不。
长答案:不,A
是一个类模板,因此它不是可以从中继承成员(数据或函数(的东西。
此外,您的要求听起来像 - 我怎么能破坏专业化的全部目的?好吧,对不依赖于模板参数的成员使用基类的继承。这是更直接的方法,也是语言为您提供的功能。
不能只从类型继承成员函数而不扩展该类型。
有很多技巧可以达到目的:直接继承,mixin,从上面继承的成语等等。
它们都通过继承来组合接口。我不明白为什么要妖魔化它。
如果你不想要额外的类,那么你可以像:
template <class T>
class A {
public:
void f() { cout << "here" << endl; }
};
template <> class A<char> : private A<A<char> > {
public:
using A<A<char> >::f;
};
当然,人们希望能够编写template <> class A<char> : private A<char>
并获得从通用案例继承的专业化,但这是不可能的,所以我使用了一个技巧来实例化某种类型的通用案例(这里类似于 CRTP,但可以使用任何其他类型(。
另一个技巧是使用第二种类型和默认值。
我找到了一种方法:
#include <type_traits>
typedef void**const*const** dummy;
// Generic template
template <typename T1, typename T2 = dummy>
class A {
static_assert(std::is_same<T1,dummy>::value || std::is_same<T2,dummy>::value,
"too many template arguments for class template 'A'");
typedef typename std::conditional<std::is_same<T1,dummy>::value, T2, T1>::type T;
public:
int a;
T x;
int getA() {return a;}
};
// Specialization for int
template <typename X>
class A<int,X> : public A<X,int> {
public:
void foo() {}
};
类模板 A 仅使用一个模板参数进行实例化。当 A 使用 int 以外的任何类型实例化时,它具有泛型的所有成员,正如预期的那样。当 A 使用 int 实例化时,它不仅具有专用化的成员,还具有泛型的成员。
相关文章:
- 如何设置 CMake 来构建包含路径包含的代码,如 #include < libdir/lib>?
- 所有按钮是否应包含MVC代码(C )中控制器的引用
- 在R软件包中包含TMB C 代码的指南
- <thread> 在 C++/CLI 代码中包含的代码中使用。寻找更好的解决方案
- 如何将括号与其包含的代码对齐
- 将外部.asm文件包含到C++代码中
- 如何将我的C 程序分为包含普通代码行的文件,不一定功能
- 错误C1083:无法打开包含文件.文件正确包含在代码中
- 我可以以某种方式将 Maple 过程包含在C++代码中吗?
- TBB 链接器错误 如何判断我是否缺少包含或代码是否已过时
- 如果程序包含以下代码,则可能会崩溃.为什么
- 如何重定向头文件(到库)以在实例化中包含一些代码
- 如何从文件中的类调用,以使用着色器显示在另一个包含gl代码的文件中(其中两个文件都在jni文件夹中)
- 错误"Cannot open include file",但它不包含在代码中
- MS Blend 3&4可以打开包含混合代码的解决方案吗?
- Iostream库不包含在代码块中
- 将头文件中的特定函数包含到c++代码中
- c++包含使用代码或命令行选项的框架
- 在我的c++应用程序中包含第三方代码时遇到麻烦
- 编译时基于模板参数的条件包含/排除代码