首页 > 解决方案 > C++11中基于类型要求的类模板成员函数

问题描述

给定一个类模板:

template<typename T>
class AAA
    {
    void XXX(T val) { /* code */ }
    void YYY(T val) { /* code */ }
    };

我知道我可以将成员函数 XXX 专门用于特定类型,例如“int”:

template<> void AAA<int>::XXX(int val) { /* code * }

但我真正想做的不是基于 T 的特定类型而是基于 T 的特定类型要求来专门化 XXX 函数,例如 T 应该是 copy_constructible。我知道 std::enable_if 是如何工作的,但无法提出正确的 C++ 语法来做我想做的事。请注意,我知道一种技术可以让我对类模板本身进行部分专门化,以使 T 可复制构造,但我不想这样做。

标签: c++c++11template-specializationenable-if

解决方案


你不能部分特化一个函数,但你可以部分特化整个类:

template<typename T, typename /* placeholder so there is a place for SFINAE */ = void>
class AAA
{
    void XXX(T val) { /* code */ }
    void YYY(T val) { /* code */ }
};

template<typename T>
class AAA<T, std::enable_if_t<std::is_copy_constructible_v<T>>>
{
    void XXX(T val) { /* code when T is copy constructible */ }
    void YYY(T val) { /* code when T is copy constructible */ }
};

推荐阅读