gpt4 book ai didi

c++ - 类定义中的模板特化

转载 作者:太空宇宙 更新时间:2023-11-04 13:53:54 24 4
gpt4 key购买 nike

我想知道是否可以将此类的全部代码放在类中(有点像 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_ifeq 只是为了简洁。

模板参数 D 是虚拟的。通常我们在模板参数、函数参数或返回类型上应用 enable_if。非模板默认构造函数是一个独特的异常,上面没有任何内容,因此是虚拟的。

对于这个简单的例子来说,这种方法可能有点矫枉过正,因为模板特化可能更简单。但是一个 30 行代码的类只需要一个构造函数这样的专门化,这样肯定会更简单,而不是为整个类专门化复制所有代码。有人可能会争辩说,在这种情况下,可以使用仅包含需要专门化的内容的基类来重构代码。然而:

  • 在某些情况下,您不想在两个构造函数版本之间进行选择,而只想根据类型谓词启用或禁用单个版本,例如类型是否为 std::default_constructible

  • 或者,您可能需要决定构造函数是否被声明为显式,同样取决于类型谓词(因此,提供显式和非显式版本)。

在这种情况下,enable_if 非常方便。

Check here具有五个构造函数的非常通用的元组实现示例,全部使用 enable_if,一个(默认)使用虚拟模板参数。其余四个用于显式与非显式以及元素列表与其他元组的组合。

关于c++ - 类定义中的模板特化,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22384901/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com