提升Hana迭代对的元组

时间:2017-06-05 21:22:46

标签: c++ boost-hana

我有一个模板类,它接受一对类型和一个整数常量的元组(某些类型可以重复,所以它不能是一个hana :: map)。我想迭代元组并调用为每种类型定义的静态toString()类型方法。我收到的错误是:

“错误:输入'decltype(hana :: first(c))'(又名'boost :: hana :: type_impl :: _&')不能在'::'之前使用,因为它没有成员“

struct A
{
    static std::string toString() {return std::string("A");}
};
struct B
{
    static std::string toString() {return std::string("B");}
};

using namespace hana::literals;
std::array<std::string,3> ret;
constexpr auto tupleOfPairs = hana::make_tuple(
    hana::make_pair(hana::type_c<A>, 0_c),
    hana::make_pair(hana::type_c<B>, 0_c),
    hana::make_pair(hana::type_c<B>, 5_c));

size_t idx = 0;
hana::for_each(tupleOfPairs, [&](auto c)
{
    ret[idx++] = decltype(hana::first(c))::type::toString();
});

当它只是一个元组(使用decltype(c)::type::toString())时,我有一些非常相似的工作但是只要我使用整数常量生成元组对,我就无法提取第一个元素的类型对,并做同样的事。

由于

1 个答案:

答案 0 :(得分:0)

TL; DNR: indexRepository.findAll().stream() .findFirst() .orElseThrow( () -> new IndexNotFoundException("Index cannot be found") ); 会产生一种类型&#34;对...&#34;的引用,它(它的参考)显然没有成员。简单修复:使用std::remove_reference删除引用:

decltype

这不是关于hana。把它带出循环&#34;我们可以进一步减少您的情况

ret[idx++] = 
  std::remove_reference_t<decltype(hana::first(c))>::type::toString();

这给出了(基本上)与您相同的错误消息:

  

错误:&#39; decltype(get_it())&#39; (又名&#39; A&amp;&#39;)不是类,命名空间或枚举

这告诉我们#include <string> struct A { static std::string toString() { return std::string("A"); } }; template<typename T> T & get_it() { static T thing; return thing; } int main() { std::string str = decltype(get_it<A>())::toString(); } (对A &的引用)不是类(等),因此不能有(静态)成员。当您的编译器告诉您:

时,情况也是如此
  

错误:键入&#39; decltype(hana :: first(c))&#39; (又名&#39; boost :: hana :: type_impl :: _&amp;&#39;)不能在&#39; ::&#39;之前使用。因为它没有成员

A参考。当然它没有成员。引用的类具有,因此只需使用boost::hana::type_impl::_ &删除引用。

documentation,btw(强调我的)中还注明了std::remove_reference的返回类型是引用类型这一事实:

  

返回一对的第一个元素。注意如果Product实际存储它包含的元素,则hana :: first 需要返回左值引用,左值引用为const或rvalue引用到第一个元素,其中引用的类型必须匹配传递给第一个的对的类型。如果[..,这里不适用]。