假设我有一个class X ] >>,它具有一些已定义的函数,我也希望class X 有全部,还有一些其他功能 (一个现实的例子是Vector 和Vector 都具有Vector 函数,但也可以在3D空间中实现旋转)
template <class T, size_t N> class X { public: void a(); X<T, N> b(X<T, N> x); // etc static X<T, n> c(); protected: T data[N]; };
[1]部分专业化方法
std :: hash '>] >>与std :: hash ' >因此,如果我为X 重载哈希,X3 也将工作b)[Y]函数d是可访问c] [N]函数a,b,c是不可访问的d)[Y / N] X3 x = X3 :: c();如果[[c是accesible,则将工作template <class T> class X<T, 3> { public: void d(); }; template <class T> using X3 = X<T, 3>;
a] [Y]
[2)继承方法
template <class T>
class X3 : public X<T, 3> {
public:
void d();
};
因此,如果我为X ,X3 将不适用重载哈希b)[Y]函数d是accesiblec] [Y / N]函数a,b,c是accessible,但是b和c具有相似的cast问题 (详细信息如下)d)[N] X3 x = X3 :: c(); 将不起作用,即使是可访问a] [N]
std :: hash '>] >>与std :: hash '>
解释:
编译器知道如何将X3 转换为X (因此将X3 作为函数b 作品)编译器不知道如何将X 转换为X3 (因此将函数b和c结果赋给< [X3 变量不起作用)((通过创建移动构造函数'X3(X && x)noexcept'来绕过它,但是在这种情况下std :: hash问题仍然存在)有没有办法结合两种方法的优点?
((使用方法1除外)并重写所有类似的方法:)
//...
X3<T> b(X3<T> x) {
return X<T, 3>::b(x);
}
//...
((或方法2)以及奇怪的转换,移动/复制构造函数,并且必须专门针对诸如std :: hash的对象进行模板几次)
假设我有一个X类,其中定义了一些函数,我也希望X类具有它们的全部,但是还希望有一些其他函数(现实中的例子是Vector&...
< [template <class T, size_t N>
class X {
public:
void a() {...};
X<T, N> b(X<T, N> x);
// etc
static X<T, n> c() {...};
template<size_t uN = N, std::enable_if_t<uN==3,int>=0>
void d() {...};
protected:
T data[N];
};
在这里,将编译X<int,3> x; x.d();
,但不会编译X<int,2> x; x.d();
,因为除非d()
被禁用,否则N==3
方法将被禁用。
您可以在许多在线指南中阅读有关SFINAE在模板函数和类中的用法的更多信息(请注意,函数和类的语法有很大不同。