类定义中的模板特化

时间:2014-03-13 16:26:59

标签: c++ templates

我想知道是否有可能将这样一个类的整个代码放在类中(类似于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;
}

这有可能吗?

2 个答案:

答案 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_ifeq只是为了简洁。

模板参数D是虚拟的。通常我们在模板参数,函数参数或返回类型上应用enable_if。非模板默认构造函数是一个唯一的异常,不具备上述内容,因此是虚拟的。

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

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

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

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

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