【问题标题】:How to SFINAE using concepts on member non-template function of a template struct?如何在模板结构的成员非模板函数上使用概念 SFINAE?
【发布时间】:2021-09-16 20:34:36
【问题描述】:

背景

我正在编写一个对象池。我想提供一个构造函数,它只接受默认构造的元素计数。已经有 concept 了,我想尝试使用 C++20 功能。

代码

template <typename T, std::size_t capacity>
class object_pool {
/*
    storage for uninitialized objects
    used flags
    size
    etc...
*/

public:
    ??? object_pool(std::size_t count = capacity) {
        /* initialization */
    }

};

我可以按常规方式进行 SFINAE,如下所示:

template <typename = std::enable_if_t<std::is_default_constructible_v<T>>>
object_pool(std::size_t count = capacity) {
  /*...*/
}

问题

SFINAE 可以在模板类/结构的成员函数上使用概念吗?如果有,该怎么做?

【问题讨论】:

    标签: c++ c++20 sfinae c++-concepts


    【解决方案1】:

    你可以在签名后加一个 requires 表达式

    object_pool(std::size_t count = capacity) requires std::default_initializable<T> {
      /*...*/
    }
    

    Example

    【讨论】:

    • 我不知道概念可以放在非模板实体上。我猜这样他们就没用了……谢谢!
    • @Incompute 概念是通用的。您也可以将它们用作布尔值,例如 if (std::default_initializable&lt;T&gt;) { ... }
    • 感谢您的信息。最后一个问题:我可以在 requires 子句的任一侧对 T 进行 noexcept 检查吗?
    • @Incomputable 是检查T 是否有noexcept 函数,还是将构造函数标记为noexcept?
    • 是的,文档中很多地方都缺少要求子句。 noexcept 说明符必须放在 requires 子句之前:object_pool(std::size_t count = capacity) noexcept(std::is_nothrow_default_constructible_v&lt;T&gt;) requires std::default_initializable&lt;T&gt;
    猜你喜欢
    • 1970-01-01
    • 2018-12-28
    • 2022-01-22
    • 1970-01-01
    • 1970-01-01
    • 2018-01-22
    • 2016-06-26
    • 1970-01-01
    • 2019-11-23
    相关资源
    最近更新 更多