首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何正确检查成员在编译时boost::hana?

如何正确检查成员在编译时boost::hana?
EN

Stack Overflow用户
提问于 2019-05-07 08:32:07
回答 1查看 363关注 0票数 1

我正在编写一个物理模拟程序,我想做以下工作:我有一个适合hana的结构,我想在编译时检查这个结构是否有一个名为"absorbedEnergy“的成员:

代码语言:javascript
复制
if constexpr ( ... )

在我使用的c++17中,正确的方法是什么?

现在,使用hana文档,我想出了以下内容:

代码语言:javascript
复制
struct HasAE { double absorbedEnergy };
struct HasNoAE {};

temaplate<typename Cell>
void irelevantFunction(Cell& cell){
    auto has_absorbedEnergy = hana::is_valid(
        [](auto &&p) -> decltype((void) p.absorbedEnergy) {});

    if constexpr(has_absorbedEnergy(cell)) { ... }
}

HasAE cell;
HasNoAE anotherCell;
cell.absorbedEnergy = 42; //value known at runtime

irelevantFunction(cell);
irelevantFunction(anotherCell);

问题是,它在g++ 7.4.0中编译得很好,并且做了我期望的事情,但无法使用clang++-8进行编译。它给出了一个错误:

如果条件不是常量表达式

我怀疑这是因为has_absorbedEnergy - cell的论点并不是常量的表达。有办法绕道吗?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2019-05-07 09:30:56

您的问题似乎与标准中关于if constexpr中的expession必须是“bool类型的上下文转换常量表达式”(参见这个问题)的要求有关。您可以通过将if constexpr更改为:

代码语言:javascript
复制
if constexpr (decltype(has_absorbedEnergy(cell)){})

https://wandbox.org/permlink/hmMNLberLJmt0ueJ

或者,您可以使用expression来实现您想要的结果(请参阅cppreference.com文档std::void_t):

代码语言:javascript
复制
#include <type_traits>
#include <iostream>

template <typename, typename= std::void_t<>>
struct has_absorbedEnergy : std::false_type {};

template <typename T>
struct has_absorbedEnergy<T,
  std::void_t<decltype(std::declval<T&>().absorbedEnergy)>>
    : std::true_type {};

template <typename Cell>
void irelevantFunction([[maybe_unused]] Cell &cell) {
  if constexpr (has_absorbedEnergy<Cell>::value)
    std::cout << "Has absorbedEnergy\n";
  else
    std::cout << "Does not have absorbedEnergy\n";
}

struct HasAbsorbedEnergy
  { int absorbedEnergy; };

struct DoesNotHaveAbsorbedEnergy
  {};

int main()
{
HasAbsorbedEnergy Has;
DoesNotHaveAbsorbedEnergy DoesNot;

irelevantFunction(Has);
irelevantFunction(DoesNot);
}

https://wandbox.org/permlink/0559JhpVQBOwHC0Z

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/56018531

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档