我想知道是否有可能将这样一个类的整个代码放在类中(类似于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;
}
这有可能吗?
答案 0 :(得分:0)
是
尽管必须在其他模板中完成专业化,但完全有可能。
#include <iostream>
template <class V> class A {
public:
A() {
std::cout<<"Generic"<<std::endl;
};
};
template <> class A<bool>
{
public:
A() { std::cout << "Bool specialization" << endl; }
};
int main(int argc, char** argv) {
A<int> a;
A<bool> b;
}
答案 1 :(得分:0)
是的,可以在没有特化的单个类定义中包含所有内容,使用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
。
或者,您可能需要决定是否声明构造函数explicit
,同样取决于类型谓词(因此,提供显式和非显式版本)。
在这种情况下,enable_if
非常方便。
Check here一个带有五个构造函数的非常通用的元组实现的示例,全部使用enable_if
,一个(默认)使用虚拟模板参数。其余四个用于显式与非显式和元素列表与其他元组的组合。