在C ++中是否有一种方法可以在编译时将类型转换为整数(也许使用typeid)? 我的目标是为该类中的每种类型传递唯一代码:
template<int TypeCode>
class MyClass
{
};
编辑:关于我想要做的更多细节。 事实上,MyClass将更像是:
template<int Code>
class AbstractBase
{
};
我使用大量CRTP技术编写了一个高度模板化的代码,我需要检查某些操作的类型之间的兼容性。为此,我的想法是从AbstractBase类继承兼容类型,为所有这些类型指定相同的代码。使用它,并简单地调用std::enable_if<std::is_base_of<AbstractBase<MyCode>, T>::value>::type
我将能够检查某些操作的类型兼容性。
首先,我可以手动生成代码,但如果我可以自动从类型生成此代码,它会更优雅。
答案 0 :(得分:2)
有很多方法。这是模板专业化:
#include<iostream>
using namespace std;
template<class T> struct type_code { enum{value=0}; }; // unknown type code
template<> struct type_code <int> { enum{value=1}; };
template<> struct type_code <float>{ enum{value=2}; };
int main() {
cout << type_code<void>::value << endl;
cout << type_code<int>::value << endl;
cout << type_code<float>::value << endl;
}
输出:
0
1
2
答案 1 :(得分:0)
不确定我是否完全理解你。 这是你在说什么吗?
template<int TypeCode>
class MyClass
{
private:
int i;
double d;
public:
template<typename T>
operator T()
{
if(strcmp(typeid(T).name(),"int")==0)
return i;
else if(strcmp(typeid(T).name(),"double")==0)
return d;
// some other types here ...
}
};
答案 2 :(得分:0)
好吧,您可以创建一个类型列表,然后在编译时提取该列表中类型的索引。
从我的另一个答案来看,这是一种技巧:
#include <type_traits>
template<typename... Types>
struct Seq {};
template<typename T, typename Seq, typename=void>
struct IndexOf;
template<typename T, typename First, typename... Types>
struct IndexOf<T, Seq<First, Types...>, typename std::enable_if< std::is_same<T, First>::value >::type > {
enum { value = 0 };
};
template<typename T, typename First, typename... Types>
struct IndexOf<T, Seq<First, Types...>, typename std::enable_if< !std::is_same<T, First>::value >::type > {
enum { value = 1+IndexOf<T,Seq<Types...>>::value };
};
typedef Seq< bool, char, unsigned char, short, unsigned short, int, unsigned int, long, unsigned long > IntegerTypes;
#include <iostream>
int main() {
std::cout << IndexOf< int, IntegerTypes >::value << "\n";
// this next line will not compile, because void is not in the IntegerTypes sequence:
// std::cout << IndexOf< void, IntegerTypes >::value << "\n";
}
我在整数上使用它。
因此,如果你有一个你想要整数的类型列表,你可以只列出所有类型,上面的技术将给每个类型一个唯一的整数(反向映射也相对容易 - 编译时间索引到要输入的列表。