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

标签 c++ templates

我想知道是否可以将此类的全部代码放在类中(有点像 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/

相关文章:

php - 使用哪种后端网络编程语言

C++模板函数错误: template-id does not match any template declaration

c++ - 使用 std::enable_if 声明带有可变模板参数的括号运算符

c++ - 如何使用 select() 和 gRPC 创建服务器?

c++ - 用 '*'(特殊字符)初始化一个 vector ,然后打印它

c++ - 由于字符数组到指针衰减而无法推导非类型模板参数?

c++ - 具有非类型模板参数的方法

c++ - 脱离的 std::optional<T> 对象的散列是什么?

c++ - std::ifstream 缓冲区缓存

html - 如何创建一个看起来像 Python 笔记本的网页?