获取类型列表中类型的索引
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);
}
我有一个简单的 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);
}