C++ 变量模板类,从其参数列表中获取特定类型的索引

C++ 变量模板类,从其参数列表中获取特定类型的索引,c++,class,variadic-templates,C++,Class,Variadic Templates,是否可以实现可变模板类的函数成员,该类从可变参数列表返回给定类型的索引 我看到的问题是创建某种伪变量参数列表,只是为了触发编译时模板求值 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)

是否可以实现可变模板类的函数成员,该类从可变参数列表返回给定类型的索引

我看到的问题是创建某种伪变量参数列表,只是为了触发编译时模板求值

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...);
    }
  }
模板
福班
{
模板
整数获取idx(整数i、常量目标和当前、目标…参数)
{
如果(标准::相同(T,TArg)){
返回i;
}
否则{
返回get_id(i+1,args…);
}
}
用法类似于:

Foo<A, B, C> foo;
int i = foo.get_idx<B>(); // i == 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
Foo-Foo;
int i=foo.get_idx();//i==1

您可以使用以下内容:

Foo<A, B, C> foo;
int i = foo.get_idx<B>(); // i == 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
模板结构获取索引;
模板
结构get_索引:std::integral_常量{};
模板
结构获取索引:
积分常数{};
#if 1//显式错误,但您已经有了错误,但没有该错误。
模板
结构获取索引
{
//条件始终为false,但应取决于T
静态_断言(sizeof(T)==0,“未找到元素”);
};
#恩迪夫

注意:您没有指定重复匹配类型的情况(因此我选择第一个), 如果类型不匹配也不匹配(因此我做了一个编译时错误)


我相信这就是你要找的。@Nard反过来说,从索引中获取类型。OP想从类型中获取索引。@T.C.据我所见,OP使用递归检查每个索引的类型,直到找到正确的类型。我相信通过使用
std::tuple\u元素
他可以在一个循环中完成这项工作。有“找不到类型”的更好方法。现在它的格式不正确,不需要诊断,因此假设未来的编译器可能会拒绝它。@T.C:我添加了显式的“找不到类型”案例,以允许OP有其他行为(如返回
-1
)。添加了注释。@Jarod42:谢谢,效果很好!找不到类型case不应该像在代码中那样编译。关于重复的类型,它也不应该编译,但因为这似乎很难实现(我认为),所以可以将其保留为未指定的。@Stringer:您可以添加类似于
static_assert(!contains::value,“duplicate element found”);
(带有一个
包含的
类似于
获取索引
)在
获取索引
@Jarod42:你能解释为检测重复吗?我迷路了,我不明白。