c++11 可变参数模板得到指定类型位置

自己试过的两个方法:

#include <iostream>

template<typename P,  typename... Ts> struct IndexOf;

template<typename P>
struct IndexOf<P> {
   static constexpr int value =  -1;
};,

/*template<typename P, typename... Ts>
struct IndexOf<P, P, Ts...> {
   static constexpr int value = 0;
};*/

template<typename P, typename Head, typename... Ts>
struct IndexOf<P, Head, Ts...>{
  static constexpr int temp = std::is_same<P,Head>::value ? 0 : IndexOf<P, Ts...>::value;
  static constexpr int value = std::is_same<P,Head>::value ? 0 : temp == -1 ? -1 : 1 + temp;
};

template<typename... Ts>
class Test {

public:
   template<typename T> 
   constexpr int GetIndex(T) {
      constexpr int i = IndexOf<T, Ts...>::value;
      return i;
   }
};

int main() {

   Test<int, double, float,char> t;
   
   int i = t.GetIndex(float());
   int j = t.GetIndex(std::string());
   int m = t.GetIndex(char());
   int k = t.GetIndex(int());
   
   std::cout << i << std::endl;
   std::cout << j << std::endl;
   std::cout << m << std::endl;
   std::cout << k << std::endl;

   return 0;
};

另外一个:

#include <iostream>

template<typename P,  typename... Ts> struct IndexOf;

template<typename P>
struct IndexOf<P> {
   static constexpr int value =  -1;
};

template<typename P, typename... Ts>
struct IndexOf<P, P, Ts...> {
   static constexpr int value = 0;
};

template<typename P, typename Head, typename... Ts>
struct IndexOf<P, Head, Ts...>{
  static constexpr int temp = IndexOf<P, Ts...>::value;
  static constexpr int value =  temp == -1 ? -1 : 1 + temp;
};

template<typename... Ts>
class Test {

public:
   template<typename T> 
   constexpr int GetIndex(T) {
      constexpr int i = IndexOf<T, Ts...>::value;
      return i;
   }
};

int main() {

   Test<int, double, float,char> t;
   
   int i = t.GetIndex(float());
   int j = t.GetIndex(std::string());
   int m = t.GetIndex(char());
   int k = t.GetIndex(int());
   
   std::cout << i << std::endl;
   std::cout << j << std::endl;
   std::cout << m << std::endl;
   std::cout << k << std::endl;
};

两种方式都可以得到类型的位置,不过第二种方式,我不确定在其它编译器上是否也有效。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值