【问题标题】:Specializing class template member function based on type requirement in C++11C++11中基于类型要求的类模板成员函数
【发布时间】:2021-06-05 03:08:57
【问题描述】:

给定一个类模板:

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 * }

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

【问题讨论】:

  • 所以基本上你是在问如何使用std::enable_if(in c++11)?
  • 函数不能部分特化,在 C++ 中。您必须部分专业化课程。根据具体情况,您通常可以找到一些解决方法来专门化模板类,例如使用辅助类来实现类方法,以及部分专门化辅助类。
  • 顺便说一下,您的示例是专门针对类,而不是功能。
  • 请注意,使用 C++20 概念,我认为您可以轻松重载有关 T 的函数是否可复制。
  • Enlico,上面的代码特化了类模板的一个成员函数。

标签: c++ c++11 template-specialization enable-if


【解决方案1】:

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

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 */ }
};

【讨论】:

  • 请注意,std::is_copy_constructible_v&lt;T&gt; 仅在 C++17 中可用。在 C++11 中,您应该使用 std::is_copy_constructible&lt;T&gt;::value。同样适用于std::enable_if_t
  • 我知道我可以部分专业化整个课程,但出于某种原因想避免它。这似乎是 C++11 中的一个缺陷,我只能根据参数的实际类型而不是该类型的某些要求来专门化类模板的函数。我知道 C++20 提供了一种方法来做我想做的事,所以我会对此进行调查。是的,我知道杰罗姆关于你提到的事情,谢谢!
猜你喜欢
  • 2016-06-16
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-07-07
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多