C++可不可以知道一个模板类被特化了多少次
C++能否知道一个模板类被特化了多少次?
我在想一个技术问题----模板代码能否探测到自身被特化了多少次?
不能直接用搜代码的方式准确的知道一个模板被特化了多少次:
因为,模板可以被特化,或者被继承类偏特化。如果有复杂的模板继承关系的话,那么特化的次数是可能一个指数。
所以我想请教各位高手,假设我希望写下面的一段代码:
如果i不在Hello这个模板类里面声明,在其他地方存在也可以。总之,我的需求就是:c++程序本身是否有能力知道,某个模板被特化了多少次,并且程序本身打印出来?
不知道模板元编程之类的技术是不是能做到?
谢谢。
------解决思路----------------------
这个只能知道各种特化的类的实例有多少个,而不是特化的类有多少个。
比如:
------解决思路----------------------
不好意思,说错了,楼主的意思其实不是特化。特化一般是指这种情况:
------解决思路----------------------
------解决思路----------------------
这个解决方案可行。用classType的map,其实用set也可以,反正重复的会覆盖
我在想一个技术问题----模板代码能否探测到自身被特化了多少次?
不能直接用搜代码的方式准确的知道一个模板被特化了多少次:
因为,模板可以被特化,或者被继承类偏特化。如果有复杂的模板继承关系的话,那么特化的次数是可能一个指数。
所以我想请教各位高手,假设我希望写下面的一段代码:
template<class T>
class Hello
{
//加入了某些代码,以及变量int i;
...
}
int main()
{
//我有很多特化Hello模板类及其继承类的代码
Hello<int> ...
Hello<ABC> ...
cout<<i<<endl;//这个i打印出Hello被特化了多少次.
return 0;
}
如果i不在Hello这个模板类里面声明,在其他地方存在也可以。总之,我的需求就是:c++程序本身是否有能力知道,某个模板被特化了多少次,并且程序本身打印出来?
不知道模板元编程之类的技术是不是能做到?
谢谢。
------解决思路----------------------
这个只能知道各种特化的类的实例有多少个,而不是特化的类有多少个。
比如:
template<class T>
class Hello
{
public:
Hello()
{
i++;
}
static int i;
...
}
int Hello::i=0;
int main()
{
//我有很多特化Hello模板类及其继承类的代码
Hello<int> a,b,c;
Hello<ABC> d,e,f;
cout<<i<<endl;//这里i应该是6,而类特化应该是2个
return 0;
}
------解决思路----------------------
不好意思,说错了,楼主的意思其实不是特化。特化一般是指这种情况:
template<typename T1, typename T2>
class Test
{
public:
Test(T1 i,T2 j):a(i),b(j){cout<<"模板类"<<endl;}
private:
T1 a;
T2 b;
};
template<>
class Test<int , char>
{
public:
Test(int i, char j):a(i),b(j){cout<<"全特化"<<endl;}
private:
int a;
char b;
};
template <typename T2>
class Test<char, T2>
{
public:
Test(char i, T2 j):a(i),b(j){cout<<"偏特化"<<endl;}
private:
char a;
T2 b;
};
------解决思路----------------------
hash_map<const char *, int> g_obj_map;
Hello()
{
g_obj_map.insert(make_pair<const char *, int>(typeid(T).name(), 1));
}
cout << "size: " << g_obj_map.size() << endl;
------解决思路----------------------
定义全局变量int i,然后在Hello的构造函数里面把i++就可以了。
这个只能知道各种特化的类的实例有多少个,而不是特化的类有多少个。
比如:template<class T>
class Hello
{
public:
Hello()
{
i++;
}
static int i;
...
}
int Hello::i=0;
int main()
{
//我有很多特化Hello模板类及其继承类的代码
Hello<int> a,b,c;
Hello<ABC> d,e,f;
cout<<i<<endl;//这里i应该是6,而类特化应该是2个
return 0;
}
hash_map<const char *, int> g_obj_map;
Hello()
{
g_obj_map.insert(make_pair<const char *, int>(typeid(T).name(), 1));
}
cout << "size: " << g_obj_map.size() << endl;
这个解决方案可行。用classType的map,其实用set也可以,反正重复的会覆盖