自己试过的两个方法:
#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;
};
两种方式都可以得到类型的位置,不过第二种方式,我不确定在其它编译器上是否也有效。