【问题标题】:Declaring multiple implementations of single function using concepts使用概念声明单个函数的多个实现
【发布时间】:2021-08-14 05:03:17
【问题描述】:

我希望能够使用概念 (C++20) 为类型定义方法实现。

Value 结构在value.hpp 中声明

template <typename T> struct Value
{
    T value;
    Value(T val) : value(val){};
    // For example I'll use `operator bool()`
    constexpr operator bool() const;
    // T can literally be anything, and it still must be conversible to bool/int/etc
}

bool 运算符重载在value.cpp 中定义

template<Concepts::is_pointer T> constexpr Value<T>::operator bool() const { return true; };
template<Concepts::has_bool T> constexpr Value<T>::operator bool() const { return (bool)value; };
template<typename T> constexpr Value<T>::operator bool() const { return std::numeric_limits<bool>::quiet_NaN(); };

但上面的代码会为每个定义产生以下编译错误:

src/value.cpp:9:43: error: redefinition of 'constexpr Value<T>::operator bool() const'
9 |  template<Concepts::has_bool T> constexpr Value<T>::operator bool() const { return (bool)get(); };
  |                                           ^~~~~~~~

有没有一种干净的方法来实现所需的行为?

我尝试了什么:

  • 单个函数的定义(但不能被覆盖)
  • 使用 requires 关键字(同样的错误,更详细)

【问题讨论】:

  • OT:std::numeric_limits&lt;bool&gt;::quiet_NaN() 毫无意义,always returns 0
  • @cpplearner 那是一个模板代码(与 int、float 等相同),但在这种情况下 - 是的,那毫无意义。

标签: c++ gcc c++20


【解决方案1】:

您当然可以使用约束定义多个重载函数模板或类模板的成员函数,但它们必须就是这样——重载。你不能只声明一个成员函数,然后提供几个实现。所以将它们全部声明在Value 中——包括实现,为了简单起见,因为通常的原因这些东西必须放在头文件(或模块接口单元)中。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2021-12-19
    • 2016-03-20
    • 1970-01-01
    • 2021-04-11
    • 1970-01-01
    • 1970-01-01
    • 2019-04-07
    相关资源
    最近更新 更多