【问题标题】:Variadic template class, getting index of a specific type from its argument list可变模板类,从其参数列表中获取特定类型的索引
【发布时间】:2015-02-19 16:43:17
【问题描述】:

是否有可能实现一个可变参数模板类的函数成员,它从可变参数列表中返回给定类型的索引。

我看到的问题是创建某种假的可变参数列表,只是为了触发编译时模板评估。

template<typename... TArgs>
class Foo
{
  template<typename T, typename TArg>
  int _get_idx(int i, const TArg &curr, TArgs...args)
  {
    if (std::is_same(T, TArg)) {
        return i;
    }
    else {
        return get_id(i+1, args...);
    }
  }

用法类似于:

Foo<A, B, C> foo;
int i = foo.get_idx<B>(); // i == 1

【问题讨论】:

  • 我相信std::tuple_element 就是您要找的。​​span>
  • @Nard 反过来,从索引中获取类型。 OP 希望从类型中获取索引。
  • @T.C.据我所知,OP 正在使用递归来检查每个索引的类型,直到他得到正确的索引。我相信通过使用std::tuple_element,他可以在一个循环中这样做。

标签: c++ class variadic-templates


【解决方案1】:

你可以使用类似的东西:

template <typename T, typename... Ts> struct get_index;

template <typename T, typename... Ts>
struct get_index<T, T, Ts...> : std::integral_constant<std::size_t, 0> {};

template <typename T, typename Tail, typename... Ts>
struct get_index<T, Tail, Ts...> :
    std::integral_constant<std::size_t, 1 + get_index<T, Ts...>::value> {};

#if 1 // explicit error case, but you already have error without that. 
template <typename T>
struct get_index<T>
{
    // condition is always false, but should be dependant of T
    static_assert(sizeof(T) == 0, "element not found");
};
#endif

Live example

注意:您没有指定重复匹配类型会发生什么(所以我采用第一个), 也不是类型不匹配(所以我做了编译时错误)

Live Demo with duplicates

【讨论】:

  • 有更好的方法来处理“找不到类型”的情况。现在它的格式不正确,不需要诊断,因此假设的未来编译器可能会拒绝它。
  • @T.C:我添加了明确的“找不到类型”案例以允许 OP 有其他行为(如返回 -1)。已添加评论。
  • @Jarod42:谢谢,就像一个魅力!与您的代码一样,“找不到类型”的情况不应编译。关于重复类型,它也不应该编译,但由于这似乎很难实现(我认为),所以可以不指定。
  • @Stringer:您可以在get_index&lt;T, T, Ts...&gt; 中添加类似static_assert(!contains&lt;T, Ts...&gt;::value, "duplicate element found"); 的内容(带有类似于get_indexcontains)。
  • @Jarod42:你能解释一下检测重复吗?我迷路了,我不明白。
猜你喜欢
  • 1970-01-01
  • 2012-11-18
  • 2023-03-22
  • 2014-11-27
  • 2017-07-13
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-09-08
相关资源
最近更新 更多