gpt4 book ai didi

c++ - 将数组与可变参数模板相关联

转载 作者:行者123 更新时间:2023-11-30 03:46:18 25 4
gpt4 key购买 nike

我现在正在学习一些关于 C++11、C++14 和 C++1z 中的模板和模板的知识。我正在尝试编写一个带有内部类的可变类模板,该类模板将关联 int每个模板参数 - 并且有一个 constexpr返回其数组表示的方法。

假设我已经确保模板不能接收两个相同类型的参数。我正在考虑这样做:

template <typename... Types>
struct MyVariadicTemplate {
//we know that all types in Types... are different
template <int... Values>
struct MyInnerTemplate {
//I need to make sure that sizeof...(Values) == sizeof...(Types)
constexpr std::array<int, sizeof...(Values)> to_array() {
std::array<int, sizeof...(Values)> result = {Values...};
return result;
// this is only valid since C++14, as far as I know
}
};
};

这段代码应该是有效的(如果不是,我很想知道为什么)。现在,我想添加另一个内部模板:

template <typedef Type>
struct AnotherInnerTemplate {};

有一个 public typedef , 代表 MyInnerTemplate其中一个位于 Type 的位置在Types...和其他地方的零 - 在这里我迷路了。我不知道如何进行

我将不胜感激关于如何做到这一点的任何提示 - 如果我正朝着错误的方向前进,我希望有人能给我一个关于如何做到这一点的提示。

最佳答案

我想你要找的是这样的东西。

#include <array>
#include <cstddef>
#include <iostream>
#include <type_traits>

template <typename NeedleT, typename... HaystackTs>
constexpr auto get_type_index_mask() noexcept
{
constexpr auto N = sizeof...(HaystackTs);
return std::array<bool, N> {
(std::is_same<NeedleT, HaystackTs>::value)...
};
}

template <typename T, std::size_t N>
constexpr std::size_t ffs(const std::array<T, N>& array) noexcept
{
for (auto i = std::size_t {}; i < N; ++i)
{
if (array[i])
return i;
}
return N;
}

int
main()
{
const auto mask = get_type_index_mask<float, bool, int, float, double, char>();
for (const auto& bit : mask)
std::cout << bit;
std::cout << "\n";
std::cout << "float has index " << ffs(mask) << "\n";
}

输出:

00100
float has index 2

魔法发生在参数包扩展中

(std::is_same<NeedleT, HaystackTs>::value)...

HaystackTs 中针对 NeedleT 测试每种类型。如果你想考虑 const intint 相同的类型,你可能想将 std::decay 应用于任一类型。

关于c++ - 将数组与可变参数模板相关联,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34144144/

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