【发布时间】:2023-03-23 15:19:02
【问题描述】:
我正在浏览很棒的 boost::hana 库的帮助页面的示例,但无法让内省示例正常工作。
此代码旨在在编译时检查对象是否具有特定的成员函数,然后使用该成员函数或执行默认操作。
所以我声明了这两种类型:
struct WithoutToString
{ };
struct WithToString
{
std::string toString()
{
return "implements toString()";
}
};
这是使用hana::is_valid 进行检查的第一个版本:
auto has_toString = hana::is_valid([] (auto&& obj) -> decltype(obj.toString()) { });
template <typename T>
std::string optionalToString1(T const& obj)
{
return hana::if_(has_toString(obj),
[] (auto& x) { return x.toString(); },
[] (auto& x) { return "toString not defined"; }
)(obj);
}
这是使用hana::sfinae 进行检查的第二个版本:
template <typename T>
std::string optionalToString2(T const& obj)
{
auto maybeToString = hana::sfinae([](auto&& x) -> decltype(x.toString())
{
return x.toString();
});
return maybeToString(obj).value_or("toString not defined");
}
像这样使用两个版本...
int main()
{
WithToString obj;
std::cout << optionalToString1(obj);
std::cout << optionalToString2(obj);
return 0;
}
...总是显示“toString not defined”而不是“implements toString()”。
注意:检查 obj 和 static_assert(has_toString(obj), "Does not implement toString()."); 显示正确的行为。
我错过了什么吗?还是编译器(clang 5.0.1)或库(boost 1.66)问题?
谢谢。
【问题讨论】:
标签: c++ boost boost-hana