- android - 多次调用 OnPrimaryClipChangedListener
- android - 无法更新 RecyclerView 中的 TextView 字段
- android.database.CursorIndexOutOfBoundsException : Index 0 requested, 光标大小为 0
- android - 使用 AppCompat 时,我们是否需要明确指定其 UI 组件(Spinner、EditText)颜色
我想知道是否可以将此类的全部代码放在类中(有点像 Java)。我这样做是为了一段代码,而不是必须搜索每个函数,我宁愿把整个类(class)写在一张纸上(是的,我打印它们,这些天我倾向于喜欢纸) .
#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
,一个(默认)使用虚拟模板参数。其余四个用于显式与非显式以及元素列表与其他元组的组合。
关于c++ - 类定义中的模板特化,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22384901/
关闭。这个问题不符合Stack Overflow guidelines .它目前不接受答案。 我们不允许提问寻求书籍、工具、软件库等的推荐。您可以编辑问题,以便用事实和引用来回答。 关闭 4 年前。
正如您在 this travis.yml 中看到的那样文件,我的代码依赖于一些第三方库,我在构建项目之前将它们安装在远程系统上。 Travis 每次推送提交时都会下载并构建这些库,这可以避免吗?我的意
我是一名优秀的程序员,十分优秀!