gpt4 book ai didi

c++ - 将 constexpr 数组扩展为一组非类型模板参数

转载 作者:可可西里 更新时间:2023-11-01 16:38:35 28 4
gpt4 key购买 nike

假设我有一个编译时 constexpr 数组和一个带有一组与数组元素类型相同的非类型参数的可变参数类模板。

我的目标是用数组中的值实例化类模板:

struct Container
{
int containee[3];
};

constexpr Container makeContainer();

template <int... Elements> class Foo;

Foo<makeContainer().containee[0],
makeContainer().containee[1],
makeContainer().containee[2]> foo;

上面的代码运行良好。但是,每当我需要实例化 Foo 时都必须手动索引数组,这让我很不高兴。模板。我希望编译器自动为我执行此操作:

Foo<Magic(makeContainer().containee)> foo;

我在 cppreference 上做了一些 RTFM,但这没有帮助。我知道 std::forward<>() , 但它不能应用于模板参数列表。

最佳答案

  1. makeContainer 更改为带有 constexpr operator()constexpr lambda struct < em>(C++17)。函数指针在这里不起作用。

    struct makeContainer
    {
    constexpr auto operator()() const
    {
    return Container{/* ... */};
    }
    };
  2. 使用 std::make_index_sequencestd::index_sequence 生成索引的编译时序列:

    template <typename C>
    constexpr auto fooFromContainer(const C& container)
    {
    return fooFromContainerImpl(container, std::make_index_sequence<3>{});
    }
  3. 通过C创建一个新的constexpr容器实例,然后扩展序列以索引常量表达式中的元素:

    template <typename C, std::size_t... Is>
    constexpr auto fooFromContainerImpl(const C& container, std::index_sequence<Is...>)
    {
    constexpr auto c = container();
    return Foo<c.containee[Is]...>{};
    }

complete example on wandbox.org


只是为了好玩,这是一个 C++20 实现:

struct container { int _data[3]; };

template <int... Is>
struct foo
{
constexpr auto t() const { return std::tuple{Is...}; }
};

template <typename C>
constexpr auto foo_from_container(const C& c)
{
return []<std::size_t... Is>(const auto& c, std::index_sequence<Is...>)
{
return foo<c()._data[Is]...>{};
}(c, std::make_index_sequence<3>{});
}

int main()
{
constexpr auto r = foo_from_container([]{ return container{42, 43, 44}; });
static_assert(r.t() == std::tuple{42, 43, 44});
}

live example on wandbox.org

关于c++ - 将 constexpr 数组扩展为一组非类型模板参数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47263565/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com