使用"hana::is_valid"在常量引用时失败
Using `hana::is_valid` fails with const references
我正在使用hana来确定对象是否具有如下所示的Length
成员:
using boost::hana::is_valid;
static const auto has_length
= is_valid([](const auto& obj)
-> decltype(obj.Length(),void()) {});
这工作正常....我可以整天用它做静态断言,让我心满意足。 所以下一步在逻辑上是enable_if
一个函数:
template<typename T>
auto foo(T t) -> std::enable_if_t<has_length(t), void>
{
}
struct mine
{
int Length() const { return 0; }
};
int main()
{
foo(mine{});
}
这工作得很好。但是一旦我将T
更改为const T&
,我们就会收到没有合适重载的错误:Godbolt
所以我的问题是:为什么会这样?
问题是调用引用不是constexpr的函数不是constexpr。这就是hana::is_valid
有用的地方,因为它返回一个类似integral_constant
的值,其中包含一个静态 constexpr 布尔值,因此我们可以只查看返回类型。请参阅bool_
。
下面是一个示例:
#include <boost/hana.hpp>
#include <type_traits>
namespace hana = boost::hana;
static auto has_length = hana::is_valid([](auto&& t)
-> decltype(t.Length()) { });
template <typename T>
auto foo(T const& t)
-> std::enable_if_t<decltype(has_length(t)){}, void>
// ^-- notice the return type
// is a boolean integral constant
{ }
struct mine
{
int Length() const { return 0; }
};
int main()
{
foo(mine{});
}
相关文章:
- #定义c-预处理器常量..我做错了什么
- 用C++中的一个变量定义一个常量
- 什么时候在C++中返回常量引用是个好主意
- 代理对象的常量正确性
- 我想将一个对T类型的非常量左值引用绑定到一个T类型的临时值
- 通过多个头文件使用常量变量
- 在cuda线程之间共享大量常量数据
- 不能在初始值设定项列表中将非常量表达式从类型 'int' 缩小到'unsigned long long'
- 有没有什么方法可以使用一个函数中定义的常量变量,也可以由c++中同一程序中的其他函数使用
- 是默认情况下分配给char数组常量的值
- 私有类型的静态常量成员
- 类似枚举的计算常量
- 递归模板化函数不能分配给具有常量限定类型"const tt &"的变量"state"
- 为什么我可以通过引用修改常量返回
- 如何创建长度由常量参数指定的数组
- 当一个值是非常量但用常量表达式初始化时使用constexpr
- 返回常量对象引用 (getter) 和仅返回字符串有什么区别?
- 隐式常量/非常量运算符布尔
- 非常量变量只读位置的赋值
- constexpr构造函数需要常量成员函数时出现问题