获取类型列表中类型的索引

Getting Index of a type in a Typelist

我有一个简单的 TypeList 实现,像这样:

template<typename... Ts>
struct TypeList
{
    static constexpr std::size_t size{ sizeof... (Ts) };
};

struct T1
    {
    };

struct T2
        {
        };

struct T3
        {
        };

using Types = mpl::TypeList<T1, T2, T3>;

我想找出类型列表 Types 中类型 T2 的索引。 这是我目前正在使用的,但是只有当我正在搜索的类型位于类型列表的开头时它才有效。否则,它会编译并出现错误“value:未声明的标识符”。

template<typename, typename>
struct IndexOf {};

// IndexOf base case: found the type we're looking for.
template <typename T, typename... Ts>
struct IndexOf<T, TypeList<T, Ts...>>
    : std::integral_constant<std::size_t, 0>
{
};



// IndexOf recursive case: 1 + IndexOf the rest of the types.
template <typename T, typename TOther, typename... Ts>
struct IndexOf<T, TypeList<TOther, Ts...>>
    : std::integral_constant<std::size_t,
    1 + IndexOf<T, Ts...>::value>
{
};

你得到这个错误是因为

IndeOf<T, Ts...>::value

未定义。 应该是

IndexOf<T, TypeList<Ts...>>::value

相反。

这个怎么样?这从 C++17 开始工作,但它可以通过用一些 hand-written 简单的 constexpr_optional 类型替换 std::optional 来轻松地用 C++14 制作 backwards-compatible不需要 full-fledged 可选类型的所有复杂性。

#include <optional>

namespace detail {
    template <typename X, typename... Ts>
    struct try_find_impl {};

    template <typename X, typename T, typename... Ts>
    struct try_find_impl<X, T,Ts...> {
        static constexpr std::optional<size_t> try_find(size_t index=0) noexcept {
            return try_find_impl<X, Ts...>::try_find(index+1);
        }
    };

    template <typename T, typename... Ts>
    struct try_find_impl<T, T,Ts...> {
        static constexpr std::optional<size_t> try_find(size_t index=0) noexcept {
            return {index};
        }
    };

    template <typename X>
    struct try_find_impl<X> {
        static constexpr std::optional<size_t> try_find(size_t=0) noexcept {
            return {};
        }
    };
}//detail

template <typename X, typename... Ts>
constexpr std::optional<size_t> try_find(size_t index=0) {
    return detail::try_find_impl<X, Ts...>::try_find(index);
}