2

我目前正在boost::hana为个人项目学习。

在下面的代码片段中,我创建了一个boost::hana::map具有as 键和一个as 值type_c<T>的实例。Foo<T>

它有效,但我真的很想将my_map变量用作类成员,并且不可能auto在成员声明中使用限定符。此外,如果我能够types以某种方式传递元组(作为模板参数或构造函数参数),那就太好了。

你有什么建议吗?

#include <iostream>
#include "boost/hana.hpp"
#include <typeinfo>

using namespace boost;

template<typename T>
class Foo {
    T t;    
public:    
    void print() { std::cout <<typeid(T).name() << t; }    
};

int main() {
    auto types = hana::tuple_t<float, int, std::string>;

    auto my_map = boost::hana::unpack(types, [](auto ...t) {
        return boost::hana::make_map(boost::hana::make_pair(t, Foo<typename decltype(t)::type>()) ...);
    });

    my_map[hana::type_c<int>].print();
}
4

1 回答 1

2

问题是 lambda 不能用于未评估的上下文 ( decltype)。

当然,从 c++14 开始,我们可以在任何自由函数上使用推导的返回类型:

namespace detail {
    template <typename... T>
    static inline auto make_foo_map() {
        return boost::hana::unpack(hana::tuple_t<T...>, [](auto... t) {
                return boost::hana::make_map(boost::hana::make_pair(t, Foo<typename decltype(t)::type>())...);
            });
    }
}

template <typename... T>
using FooMap = decltype(detail::make_foo_map<T...>());

现在很简单:

FooMap<float, int, std::string> my_map;

现场演示

Live On Coliru

#include "boost/hana.hpp"
#include <iostream>
#include <typeinfo>

using namespace boost;

template <typename T> class Foo {
    T t;

  public:
    void print() { std::cout << typeid(T).name() << "t\n"; }
};

namespace detail {
    template <typename... T>
    static inline auto make_foo_map() {
        return boost::hana::unpack(hana::tuple_t<T...>, [](auto... t) {
                return boost::hana::make_map(boost::hana::make_pair(t, Foo<typename decltype(t)::type>())...);
            });
    }
}

template <typename... T>
using FooMap = decltype(detail::make_foo_map<T...>());

int main() {
    FooMap<float, int, std::string> my_map;

    my_map[hana::type_c<int>].print();
    my_map[hana::type_c<float>].print();
    my_map[hana::type_c<std::string>].print();
}
于 2018-01-18T23:15:51.300 回答