【发布时间】: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<bool>::quiet_NaN()毫无意义,always returns 0。 -
@cpplearner 那是一个模板代码(与 int、float 等相同),但在这种情况下 - 是的,那毫无意义。