我想知道是否有可能将此类的整个代码放入类中(类似于Java).我这样做是为了编写一段代码,而不是必须搜索每个函数,我宁愿将整个类放在一张纸上(是的,我确实打印它们,最近我倾向于喜欢纸) .
#include <iostream>
template <class V> class A {
public:
A();
};
template <class V> A<V>::A() {
std::cout<<"Generic"<<std::endl;
}
template <> A<bool>::A() {
std::cout<<"bool"<<std::endl;
}
int main(int argc, char** argv) {
A<int> a;
A<bool> b;
}
现在有可能沿这些方向发展吗?
#include <iostream>
template <class V> class A {
public:
A() {
std::cout<<"Generic"<<std::endl;
};
/* somethig specifying specialization for bool */ A() {
std::cout<<"bool"<<std::endl;
}
};
int main(int argc, char** argv) {
A<int> a;
A<bool> b;
}
这有可能吗?
解决方法:
是的,可以使用std :: enable_if来选择合适的构造函数,而无需专门化就可以在一个类定义中包含所有内容:
template <bool C, typename T = void>
using only_if = typename std::enable_if <C, T>::type;
template <typename A, typename B>
using eq = typename std::is_same <A, B>::type;
template <class V> class A {
public:
template <typename D = int, only_if <!eq <V, bool>{}, D> = 0>
A() { std::cout<<"Generic"<<std::endl; };
template <typename D = int, only_if <eq <V, bool>{}, D> = 0>
A() { std::cout<<"bool"<<std::endl; }
};
其中模板别名only_if和eq只是为了简洁.
模板参数D为伪.通常,我们将enable_if应用于模板参数,函数参数或返回类型.非模板默认构造函数是唯一的异常,没有上述任何内容,因此是虚拟对象.
对于这个简单的示例(模板专门化可能更简单)而言,这种方法可能是过大的选择.但是,只需要一个专门针对一个构造函数的30行代码类的类,肯定会比通过整个类的专业化复制所有代码的方式更加简单.有人可能会争辩说,在这种情况下,可以使用仅包含需要专门处理的内容的基类来重构代码.然而:
>在某些情况下,您不想在两个构造函数版本之间进行选择,而只是根据类型谓词来启用或禁用单个版本,例如类型是否为std :: default_constructible.
>或者,您可能需要再次根据类型谓词来决定是否将构造函数声明为显式的(因此,请提供显式且非显式的版本).
在这种情况下,enable_if非常方便.
Check here是一个非常通用的元组实现的示例,其中有五个构造函数,全部使用enable_if,一个构造函数(默认)使用哑模板参数.其余四个是显式与非显式以及元素列表与其他元组的组合.